【问题标题】:CakePHP 3.0 : How to make multiple MySQL OR Condition in Query builderCakePHP 3.0:如何在查询生成器中创建多个 MySQL OR 条件
【发布时间】:2015-12-03 08:48:12
【问题描述】:

我将 cakePHP 3.0 用于 REST API。这是 MySQL 查询。

SELECT group_chat.message_parents
FROM group_chat    
WHERE group_chat.sender_groups = 1 AND group_chat.`status` = 1 AND group_chat.is_blocked = 0
OR group_chat.recever_groups = 1 AND group_chat.`status` = 1 AND group_chat.is_blocked = 0
OR group_chat.sender_groups = 1 AND group_chat.`status` = 1 AND group_chat.is_blocked = 1 AND group_chat.blocked_by = 1
OR group_chat.recever_groups = 1 AND group_chat.`status` = 1 AND group_chat.is_blocked = 1 AND group_chat.blocked_by = 1
GROUP BY group_chat.message_parents
ORDER BY group_chat.modified DESC;

我将它转换为 CakePHP 3.0 查询构建器函数。

$all_parents = $this->GroupChat->find()->select(['message_parents',])
            ->where(['sender_groups' => $params['group_id'], 'status' => ACTIVE, 'is_blocked' => DEACTIVE, 'blocked_by' => DEACTIVE])
            ->orWhere(['recever_groups' => $params['group_id'], 'status' => ACTIVE, 'is_blocked' => DEACTIVE, 'blocked_by' => DEACTIVE])
            ->orWhere(['sender_groups' => $params['group_id'], 'status' => ACTIVE, 'blocked_by' => $params['group_id']])
            ->orWhere(['recever_groups' => $params['group_id'], 'status' => ACTIVE, 'blocked_by' => $params['group_id']])
            ->order(['modified' => 'DESC'])
            ->group('message_parents');

但它不像以前的查询那样产生预期的结果。任何帮助将不胜感激。

更新:

debug($all_parents);

调试会输出这个。

'sql' => '
SELECT GroupChat.message_parents AS `GroupChat__message_parents` 
FROM group_chat GroupChat 
WHERE ((recever_groups = :c0 AND status = :c1 AND is_blocked = :c2 AND blocked_by = :c3) 
  OR (sender_groups = :c4 AND status = :c5 AND is_blocked = :c6 AND blocked_by = :c7) 
  OR sender_groups = :c8 
  OR status = :c9 
  OR blocked_by = :c10 
  OR recever_groups = :c11 
  OR status = :c12 OR blocked_by = :c13) 
GROUP BY message_parents  
ORDER BY modified DESC',

【问题讨论】:

  • 创建的查询是什么?你能调试和发布查询吗?
  • 阿莫怎么办?
  • 只做调试($all_parents);你会得到查询
  • 如果你打开调试,你的浏览器右下角应该有一个小蛋糕图标。单击它将显示调试信息。试试看?
  • @Mayura 你应该阅读这个book.cakephp.org/3.0/en/orm/…

标签: php mysql cakephp query-builder cakephp-3.x


【解决方案1】:

您的原始 SQL 查询没有任何分组。所以它有效地转化为ORed 或ANDed 的每个条件:

WHERE group_chat.sender_groups = 1 
    AND group_chat.`status` = 1
    AND group_chat.is_blocked = 0
    OR group_chat.recever_groups = 1
    AND group_chat.`status` = 1
    AND group_chat.is_blocked = 0
    OR group_chat.sender_groups = 1
    AND group_chat.`status` = 1
    AND group_chat.is_blocked = 1
    AND group_chat.blocked_by = 1
    OR group_chat.recever_groups = 1
    AND group_chat.`status` = 1
    AND group_chat.is_blocked = 1
    AND group_chat.blocked_by = 1

由于A AND A = AA OR A = A(基本布尔代数),以上简化为:

WHERE group_chat.sender_groups = 1
    OR group_chat.recever_groups = 1
    AND group_chat.`status` = 1
    AND group_chat.is_blocked = 0
    AND group_chat.is_blocked = 1
    AND group_chat.blocked_by = 1

这很可能不是你想要的。

您编写的 CakePHP 查询分组 ANDs 和 ORs,这就解释了为什么它会产生不同的结果。

【讨论】:

  • 其实应该是这样的 SELECT group_chat.message_parents FROM group_chat WHERE group_chat.status = 1 AND ( ( group_chat.sender_groups = 1 OR group_chat.recever_groups = 1 ) AND group_chat.is_blocked = 0 OR (group_chat.is_blocked = 1 AND group_chat.blocked_by = 1)) GROUP BY group_chat.message_parents ORDER BY group_chat.modified DESC;
  • 好的,现在你知道你想做什么了,继续修复它:)我很高兴这个答案有帮助!
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多