我加入了多个表,我找到了两个解决方案。我无法弄清楚有什么不同之处。有谁能告诉我?
解决方案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
");
答案 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
条款。例如,仅加入电池status
为empty
的电池:
"SELECT m, b FROM Model m JOIN m.battery b WITH b.status = 'empty'"
答案 1 :(得分:1)
从我所读到的,我可以说:
如果您在加入时使用Where
而不是On
,则会有一个区别,On
将在选择之前应用,Where
将在选择过程之后通过加入应用。
WITH
类似于On
子句,除了On
之外,它还允许您指定另一个条件。
因此,我认为当您使用With
时,它会像ON
一样工作,但Where
会在Join
选择后消除结果。
它可能会有所帮助:Stack Overflow:
this问题的选定答案也使用了其中两个和解释。