CakePHP 3 - 无法生成带有 WHERE...OR 条件的查询

标签 cakephp conditional-statements query-builder cakephp-3.x

CakePHP 3.7

我正在尝试生成一个使用 WHERE...OR 模式的查询。 MySQL 中的等效项 - 执行并给出我想要的结果是:

SELECT * FROM groups Groups WHERE (regulation_id = 1 AND label like '%labelling%') OR (id IN(89,1,8,232,228,276,268,294));

我已阅读文档的高级条件 ( https://book.cakephp.org/3.0/en/orm/query-builder.html#advanced-conditions ) 部分,但无法生成该查询。

假设 Table 类是 Groups 我有这个:

$Groups = TableRegistry::getTableLocator()->get('Groups');

$groups_data = $Groups->find('all')->where(['regulation_id' => 1);

$groups_data = $groups_data->where(['label LIKE' => '%labelling%']);

这会产生 WHERE 语句的第一段,即

SELECT * FROM groups Groups WHERE (regulation_id = 1 AND label like '%labelling%')

但是我不知道如何附加 OR 条件,特别是因为 orWhere() 已被弃用。

所以我尝试了这个 - 甚至在文档中作为示例给出:

$in_array = [89,1,8,232,228,276,268,294]; // ID's for IN condition

$groups_data = $groups_data->where(['OR' => ['id IN' => $in_array]]);

但这只是将 AND 附加到我现有的 SQL 内部:

SELECT * FROM groups Groups WHERE (regulation_id = 1 AND label like '%labelling%' AND id IN(89,1,8,232,228,276,268,294);

这不会产生正确的结果,因为语法不是运行此查询所需的语法。

如何像普通查询一样“移出”WHERE 并附加 OR 条件?

我按照文档使用QueryExpression进行了多次尝试,但所有这些都产生了 PHP fatal error ,说明与 Table 类有关 - 我怀疑这是否正确。

最佳答案

“移出”有点棘手,您必须了解在内部条件被推送到 \Cake\Database\Expression\QueryExpression 对象中,默认情况下使用 AND 连接语句,因此无论您推送什么内容,都将使用 AND 添加。

当您创建 OR 语句时,无论是隐式使用所示的嵌套数组语法,还是显式使用表达式生成器,这都会创建一个单独的、独立的表达式,其中其各个部分被连接起来使用 OR ,它将自行编译(并且由于只有一个条件,因此您看不到任何 OR),并且结果将在父表达式中使用,在您的情况下,它是查询 where 子句的主/基本表达式对象。

要么一次性传递整个内容(通过数组语法或表达式),例如:

$groups_data->where([
    'OR' => [
        'AND' => [
            'regulation_id' => 1,
            'label LIKE' => '%labelling%'
        ],
        'id IN' => $in_array
    ]
]);

当然,如果需要,您可以动态构建该数组,或者,如果您出于某种原因需要使用单独的调用 where(),您可以例如覆盖条件(第三个参数where()),并在需要的地方包含当前的:

$groups_data->where(
    [
        'OR' => [
            $groups_data->clause('where'),
            'id IN' => $in_array
        ]
    ],
    [], 
    true
);

关于CakePHP 3 - 无法生成带有 WHERE...OR 条件的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256735/

相关文章:

php - Cakephp输入日期格式

cakephp - 替换 $this->element() CakePHP

php - CakePHP 连接查询

tags - 检查 Play 标签是否有主体

Struts2 迭代器内的条件检查

symfony Doctrine QueryBuilder 到数组结果

mysql - 留言讨论查询

php - .htaccess 设置在 Google Chrome 上不起作用

vba - 图例条目、范围、饼图、删除、条件

php - 多条件搜索查询生成器 [symfony2]