2017-01-27 2 views
0

Ich habe sehr seltsames Problem mit dql.Symfony2 Lehre DQL Join - keine Ergebnisse für einige Fälle, aber Ergebnisse mit sql

Ich habe zwei Tabellen connecter mit Fremdschlüssel:

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

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

ich aktiv Vorfälle für einige Zyklen und alles zeigen müssen, ist in Ordnung, wenn ich mySQL Abfrage lilke dies tun:

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

Gleiche Abfrage auch in DQL funktioniert, aber nur für cycle_nr! = 2

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

für cycle_nr < = 2 Ich bekomme ein leeres Ergebnis. Ich denke wegen der Abszisse des Vorfalls für diesen Zyklus, aber ich frage < = 2 und nicht == 2. Irgendwelche Ideen?

Antwort

1

Die Standardverbindung in DQL ist INNER JOIN. Diese Abfragen sind nicht gleichwertig.

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

Diese SQL-Abfrage wird in DQL wie folgt geschrieben (vorausgesetzt, der Benutzer ist eine Entität)

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

Auch wenn Sie Bedingungen nur für die Verbindung haben und nicht wollen, dass es das beeinflussen Ergebnisse aus der "Haupt" -Tabelle, sollten Sie diese nur zu diesen Join-Bedingungen hinzufügen, so.

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

mit gebundenen Parametern es so, angesichts der obigen Abfrage ist in $dql aussehen sollte.

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

Vielen Dank für Ihre Antwort. Ich habe LEFT JOIN wirklich vergessen. Und jetzt bekomme ich Ergebnisse (IncidentActive-Objekt) für die Abfrage, aber einen leeren Vorfall. Was ich nicht verstehe, weil der Vorfall da ist (in DB). Vielleicht ist meine Zuordnung falsch? – degressor