2017-01-27 11 views
0

У меня возникла странная проблема с dql.Symfony2 doctrine DQL Join - нет результатов для некоторых случаев, но результаты с sql

У меня есть две таблицы Коннектер с внешним ключом:

== Table incident == 
id, cycle_nr, ... 
1, 1 
2, 3 

== Table incident_active == 
id, incident_id, user_id, ... 
1, 1,   1 
... 

Мне нужно, чтобы показать активные инциденты для некоторых циклов и все в порядке, если я MYSQL запрос lilke это:

SELECT * FROM `incident_active` LEFT JOIN incident ON incident.id = `incident_active`.incident_id WHERE cycle_nr <= 2 and user_id = 1 

тот же запрос в DQL тоже работает, но только для cycle_nr! = 2

SELECT incidentActive, incident 
      FROM AccountingBundle:IncidentActive incidentActive 
      JOIN incidentActive.incident incident 
      WHERE incidentActive.company_id = 1 AND incident.cycle_nr <= 2 

для cycle_nr < = 2 Я получаю пустой результат. Я думаю, из-за абзаца инцидента для этого цикла, но я спрашиваю < = 2, а не == 2. Любые идеи?

ответ

1

Соединение по умолчанию в DQL - INNER JOIN. Эти запросы не эквивалентны.

SELECT * FROM `incident_active` 
LEFT JOIN incident ON incident.id = `incident_active`.incident_id 
WHERE cycle_nr <= 2 and user_id = 1 

Этот SQL-запрос записывается в DQL, как это (предполагается, что пользователь является юридическим лицом)

SELECT incidentActive, incident 
FROM AccountingBundle:IncidentActive incidentActive 
LEFT JOIN incidentActive.incident incident 
WHERE incident.cycle_nr <= :cycleNr 
    AND incidentActive.user = :userId 

Кроме того, если у вас есть условия только для объединения, и не хотите, чтобы повлиять на результаты из «основной» таблицы, вы должны добавить их только в условия соединения, как это.

SELECT incidentActive, incident 
FROM AccountingBundle:IncidentActive incidentActive 
LEFT JOIN incidentActive.incident incident WITH incident.cycle_nr <= :cycleNr 
WHERE incidentActive.user = :userId 

со связанными параметрами она должна выглядеть следующим образом, учитывая выше запроса в $dql.

$result = $em->createQuery($dql) 
    ->setParameter('cycleNr', 2) 
    ->setParameter('userId', 1) 
    ->getResult(); 
+0

Благодарим вас за ответ. На самом деле я забыл о LEFT JOIN. И теперь я получаю результаты (объект IncidentActive) для запроса, но пустой инцидент. Я не понимаю, потому что инцидент есть (в БД). Может быть, мое картирование неверно? – degressor

 Смежные вопросы

  • Нет связанных вопросов^_^