2016-01-12 5 views
0

Я присоединяюсь к нескольким таблицам, и я нашел два решения. Я не могу понять, в чем разница. Может ли кто-нибудь сказать мне?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 
"); 

ответ

3

Вы пишете DQL, и вы не должны путать его с SQL. В соединении запроса DQL вам не нужно добавлять id полей явно в соединение. Doctrine позаботится об этом для вас.

"SELECT m FROM Model m JOIN m.battery b" достаточно.

к fetch-join добавить 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'"

Проверить the documentation on DQL joins для получения дополнительной информации.

1

Из того, что я прочитал, я могу сказать:

При использовании Where вместо On в присоединиться, есть одна разница, On будет применяться до выбора и Where будет применяться после selec путем объединения.
WITH похож на пункт On, который позволяет указать другое условие в дополнение к On. Так я думаю, когда вы используете With, он будет работать как ON, но Where удалит результат после выбора Join.
Это может помогает: Stack Overflow:

Selected Ответ this вопрос также используются два из них вместе с объяснением.

+1

Значит, лучше? –

+0

@RobinDijkhof Во внутреннем соединении да, но в внешнем соединении не имеет значения. –

+0

@RobinDijkhof Я думаю, что я ошибся. оптимизатор запросов выбирает лучший способ для соединения, и они могут использовать взаимозаменяемые возможности. прочитайте это http://stackoverflow.com/questions/354070/sql-join-where-clause-vs-on-clause –