Doctrine Join 条件类型中WITH 和ON 有什么区别?

问题描述 投票:0回答:3

我正在寻找有关学说子句的WITH和ON条件类型之间差异的更好解释。

我发现有关此问题的文档非常糟糕,但我仍然存有疑问。

php doctrine-orm doctrine
3个回答
24
投票

在我看来,这是教义 1 的遗留物。

当时

ON
用于重新定义关系的连接条件,而
WITH
用于在默认连接条件的基础上添加更多连接条件。

现在在教义2中我从未见过可以使用

ON
的情况。事实上,使用
ON
总是会出现异常,提示您应该使用
WITH

现在

WITH
可用于将连接条件添加到关系中定义的默认连接条件,或者,如果两个实体之间不存在关系,则定义连接条件。


1
投票

使用

ON
条件类型需要在连接的实体之间具有关系。
如果实体之间不存在关系,则可以使用
WITH
,但我们应该使用连接的另一侧来满足一些条件。
在某些情况下,
ON
WITH
条件类型是可能的,我认为
ON
的解释速度更快,并且几乎由DBMS执行。


0
投票

我在这里没有看到任何具有直观意义的答案,所以我重新阅读了文档几次,与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";
© www.soinside.com 2019 - 2024. All rights reserved.