我正在寻找有关学说子句的WITH和ON条件类型之间差异的更好解释。
我发现有关此问题的文档非常糟糕,但我仍然存有疑问。
在我看来,这是教义 1 的遗留物。
当时
ON
用于重新定义关系的连接条件,而WITH
用于在默认连接条件的基础上添加更多连接条件。
现在在教义2中我从未见过可以使用
ON
的情况。事实上,使用 ON
总是会出现异常,提示您应该使用 WITH
。
现在
WITH
可用于将连接条件添加到关系中定义的默认连接条件,或者,如果两个实体之间不存在关系,则定义连接条件。
使用
ON
条件类型需要在连接的实体之间具有关系。WITH
,但我们应该使用连接的另一侧来满足一些条件。ON
和WITH
条件类型是可能的,我认为ON
的解释速度更快,并且几乎由DBMS执行。
我在这里没有看到任何具有直观意义的答案,所以我重新阅读了文档几次,与ChatGPT进行了一些来回讨论,并得出了这样的理解:
ON
处于加入状态ON
关键字用于指定自定义连接条件,该条件将覆盖 Doctrine 生成的默认自动条件。您可以使用 ON
来定义表的连接方式,类似于常规 SQL,这会更改表在该查询中的匹配方式。
例如:
$queryBuilder
->select('a')
->from(Fruit::class, 'f')
->leftJoin(Aisle::class, 'a', 'ON', 'o.type = "produce"')
->where('f.name = "Pear"')
应相当于:
SELECT a.*
FROM fruit f
LEFT JOIN aisle a ON f.type = "produce"
WHERE f.name = "Pear";
WITH
作为附加过滤:WITH
关键字用于向连接添加自定义过滤条件。它用于在应用连接条件后过滤连接结果。用 WITH
指定的条件将附加到自动生成的条件中。
例如:
$queryBuilder
->select('a')
->from(Fruit::class, 'f')
->leftJoin(Aisle::class, 'a', 'WITH', 'o.type = "produce"')
->where('f.name = "Pear"')
应相当于:
SELECT a.*
FROM fruit f
LEFT JOIN aisle a ON a.id = f.aisle_id AND f.type = "produce"
WHERE f.name = "Pear";