Doctrine加入WITH vs WHERE

时间:2016-01-12 17:13:18

标签: join doctrine-orm dql doctrine-query

我加入了多个表,我找到了两个解决方案。我无法弄清楚有什么不同之处。有谁能告诉我?

解决方案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
");

2 个答案:

答案 0 :(得分:3)

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

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

fetch-join添加到您的select子句中b

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

如果您只想加入具有特定属性的电池,那么您需要使用WITH中的DQL条款。例如,仅加入电池statusempty的电池:

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

查看the documentation on DQL joins了解详情。

答案 1 :(得分:1)

从我所读到的,我可以说:

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

this问题的选定答案也使用了其中两个和解释。

相关问题