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/