【问题标题】:ORM query builder for complex condition in CakePHPCakePHP中复杂条件的ORM查询构建器
【发布时间】:2017-07-06 16:09:57
【问题描述】:

我有 user_messages 列 id, sender_id, receiver_id, message, deleted 的表

我必须检索所有这样的消息

SELECT *
FROM 
    user_messages UserMessages 
WHERE (
    UserMessages.deleted = false
    AND (
        (sender_id = $loggedin_user_id AND receiver_id = $user_id)
        OR 
        (sender_id = $user_id AND receiver_id = $loggedin_user_id)
    ) 
ORDER BY 
    created DESC

目前,我正在使用此查询生成器

$message_by_list = $this->UserMessages->find()
    ->where(['UserMessages.deleted' => false])
    ->andWhere(function ($exp) {
        return $exp->or_([
            'sender_id' => $this->Auth->user('id'),
            'receiver_id' => $this->Auth->user('id')
        ]);
    })

生成 sql 查询为

FROM 
    user_messages UserMessages  
WHERE 
    (UserMessages.deleted = false AND (sender_id = $loggedin_user_id OR receiver_id = $loggedin_user_id)) 
ORDER BY 
    created DESC

如上如何编写优化的 ORM 查询来检索数据?

编辑 2:更新了 arilia 答案的查询

WHERE (
        (
            UserMessages.deleted = false
        ) 
        AND 
        (
            (
                UserMessages.sender_id = $loggedin_user_id
                AND 
                UserMessages.receiver_id = $user_id
            )
            OR 
            UserMessages.sender_id = $user_id 
            OR                         /// doubt here
            UserMessages.receiver_id = $loggedin_user_id
        )
    )

【问题讨论】:

  • edit2是你要获取的查询还是我的代码生成的查询?因为我得到了一个 AND,你在这里提出了“怀疑”,而不是 OR
  • 那是你的代码生成的查询

标签: mysql cakephp orm cakephp-3.3 selectquerybuilder


【解决方案1】:

试试这个

$message_by_list = $this->UserMessages->find()
    ->where(['sender_id' => $user_id, 'receiver_id' => $logged_user_id])
    ->orWhere(['sender_id' => $logged_user_id, 'receiver_id' => $user_id])
    ->andWhere(['UserMessages.deleted' => false]);

【讨论】:

  • 我对生成的查询有疑问。检查更新代码中的/// doubt here。我认为它会获取仅匹配一列的记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2018-07-15
  • 2012-08-27
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多