学说加入 WITH 与 WHERE

Doctrine join WITH vs WHERE

我正在加入多个表,我找到了两个解决方案。我无法弄清楚有什么区别。谁能告诉我?

解决方案 1:

$query = $entityManager->createQuery("
    SELECT m FROM Model m
        JOIN m.battery b
        JOIN m.camera c
        JOIN m.connectivity co
        JOIN m.hardware h
        JOIN m.screen s
        JOIN m.sensor se                                                        
            WHERE b = m.battery
            AND c = m.camera
            AND co = m.connectivity
            AND h = m.hardware
            AND s = m.screen
            AND se = m.sensor"
);

解决方案 2:

$query = $entityManager->createQuery("
    SELECT m FROM Model m
        JOIN m.battery b
        WITH m.battery = b
        JOIN m.camera c
        WITH m.camera = c
        JOIN m.connectivity co
        WITH m.connectivity = co
        JOIN m.hardware h
        WITH m.hardware = h
        JOIN m.screen s
        WITH m.screen = s
        JOIN m.sensor se
        WITH m.sensor = se
");

据我所读,我可以说:

当您在加入中使用 Where 而不是 On 时,有一个区别,On 将在选择之前应用,而 Where 将在选择过程之后应用join.
WITH 类似于 On 子句,它允许您在 On 之外指定另一个条件。 所以我认为当你使用With时,它会像ON一样工作,但是Where会消除Join选择后的结果。
它可能有帮助:Stack Overflow

this题的选答也用了其中两个连同解释。

您正在写 DQL,您不应将其与 SQL 混淆。在 DQL 查询连接中,您不需要将 id 字段显式添加到连接 Doctrine 会为您处理。

"SELECT m FROM Model m JOIN m.battery b"就够了。

fetch-joinb 添加到您的 select 子句:

"SELECT m, b FROM Model m JOIN m.battery b"

如果你只想加入某个属性的电池,那就是你需要在你的DQL中使用WITH子句。例如,仅加入电池 statusempty:

的电池

"SELECT m, b FROM Model m JOIN m.battery b WITH b.status = 'empty'"

查看 the documentation on DQL joins 了解更多信息。