CakePHP 3-无法生成带有WHERE…或条件的查询

CakePHP 3-无法生成带有WHERE…或条件的查询,cakephp,conditional-statements,query-builder,cakephp-3.x,Cakephp,Conditional Statements,Query Builder,Cakephp 3.x,CakePHP3.7 我试图生成一个使用WHERE…或模式的查询。MySQL中的等价物——它执行并给出我想要的结果: SELECT * FROM groups Groups WHERE (regulation_id = 1 AND label like '%labelling%') OR (id IN(89,1,8,232,228,276,268,294)); 我已经阅读了文档中的Advanced Conditions()部分,但无法生成该查询 假设表类是Groups我有: $Groups =

CakePHP3.7

我试图生成一个使用
WHERE…或
模式的查询。MySQL中的等价物——它执行并给出我想要的结果:

SELECT * FROM groups Groups WHERE (regulation_id = 1 AND label like '%labelling%') OR (id IN(89,1,8,232,228,276,268,294));
我已经阅读了文档中的Advanced Conditions()部分,但无法生成该查询

假设表类是
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%')
但是,我看不到如何附加
条件,特别是因为
或where()
已被弃用

因此,我尝试了这一点——文档中甚至给出了一个示例:

$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]]);
但这只是在现有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
中“移出”并像普通查询中那样附加
条件

根据文档,我尝试了几次使用
QueryExpression
,但所有这些都产生了PHP致命错误,说明与Table类有关-我怀疑这是否正确。

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

当您创建
语句时(隐式使用所示的嵌套数组语法,或显式使用表达式生成器),这将创建一个单独的、自包含的表达式,其中使用
连接其部分,它将编译自己(因为只有一个条件,所以看不到任何
),结果将用于父表达式,在您的情况下,父表达式是查询where子句的主/基表达式对象

要么立即传递整个过程(通过数组语法或表达式),例如:

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

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

这是可行的,并且完全符合我的需要。但我确实认为这两种代码都不可读,因为如果有人盯着它看,他们就不知道它生成了什么样的SQL。如果我对
$groups\u data->SQL()进行调试
条件出现在
之前,而
在数组中看起来不是这样的。但是它仍然有效,因此我无法反驳:)有任何文档说明如何构造它们吗?我现在需要调整查询,以便它使用
,其中(…和…)或(…和…
@Andy实际上,SQL代码中的
和/或
运算符是数组/树结构中的分支节点。因此,在您的示例中,
是根节点,它有两个子节点,这两个子节点都是
节点,每个节点本身都有两个子节点。@Andy所以您想要的可以表示为
'或'=>[[a'=>1,'b'=>2],'a'=>2,'b'=>1]
键是可选的,因为它是默认的,并且因为PHP要求数组键是唯一的,这需要像这样的额外嵌套:
或'=>['和'=>['a'=>1,'b'=>2]],['和'=>['a'=>2,'b'=>1]]
$groups_data->where(
    [
        'OR' => [
            $groups_data->clause('where'),
            'id IN' => $in_array
        ]
    ],
    [], 
    true
);