【发布时间】:2023-03-27 11:09:01
【问题描述】:
我对我在 CakePHP 3 文档 Query Builder's Advanced Conditions 上读到的内容感到困惑:https://book.cakephp.org/3.0/en/orm/query-builder.html#advanced-conditions
它给出了以下代码
$query = $articles->find()
->where(['author_id' => 2])
->orWhere(['author_id' => 3])
->andWhere([
'published' => true,
'view_count >' => 10
])
->orWhere(['promoted' => true]);
并且说这等价于这条 SQL:
SELECT *
FROM articles
WHERE (promoted = true
OR (
(published = true AND view_count > 10)
AND (author_id = 2 OR author_id = 3)
))
我根本不了解它是如何工作的,因为 PHP 中条件的顺序与生成的 SQL 语句中的顺序不同(例如,->orWhere(['promoted' => true]) 在 PHP 中是最后一个,但在SQL 语句。为什么?)。
文档中唯一可能相关的信息是它所说的:
每个方法都设置当前和当前使用的组合运算符 以前的条件。
这是文档中的错误,还是有人可以解释它如何以更好的方式真正起作用?
虽然我意识到这几乎肯定是错误的,但我对该 SQL 将如何评估的理解是:
SELECT *
FROM articles
WHERE (author_id = 2 OR author_id = 3)
AND ( (published = true AND view_count > 10) OR promoted = true)
【问题讨论】:
-
@JasonJoslin 我不认为你真的理解这个问题。您根据字母顺序提供了一个答案(随后因为它是垃圾而将其删除)。这与查询中出现
OR和AND条件的顺序有关——这对查询结果有很大影响,并且肯定不会产生相同的结果,除非生成的查询始终是给定一组特定的 PHP 条件。