2016-08-08 10 views
2

Ich wähle 3 Entitäten über regulären LINKEN JOIN in DQL aus. Sie sind über Join-Tabellen verknüpft, für die auch Entitäten definiert sind, sowie mit Anmerkungen versehene Beziehungen. Die Abfrage wird ohne Fehler ausgeführt, aber meine Ergebnisse werden als flaches Array zurückgegeben. Ich würde für jeden Index einen Array mit den drei Einheiten als Array-Elemente erwarten:Doctrine DQL gibt ein flaches Array von Join zurück

SELECT e1, e2, e3 FROM AppBundle:EntityOne 
JOIN AppBundle:JoinEntityOneWithTwo e1_2 WITH e1_2.entity1 = e1.id 
JOIN AppBundle:EntityTwo e2 WITH e1_2.entity2 = e2.id 
JOIN AppBundle:JoinEntityOneWithThree e1_3 WITH e1_3.entity1 = e1.id 
JOIN AppBundle:EntityThree e3 WITH e3.id = e1_3.entity3 
WHERE e1.some_field IN ('some','values','in','e1'); 

Wenn ich getResult() auf der Abfrage aufrufe, entweder feuchtigkeitsspendend als ein Objekt oder ein Array, erhalte ich ein flachen Ergebnisse einstellen:

array(
/AppBundle/Entity/EntityOne (...), 
/AppBundle/Entity/EntityTwo (...), 
/AppBundle/Entity/EntityThree (...), 
/AppBundle/Entity/EntityOne (...), 
/AppBundle/Entity/EntityTwo (...), 
/AppBundle/Entity/EntityThree (...), 
/AppBundle/Entity/EntityTwo (...), 
/AppBundle/Entity/EntityThree (...), 
/AppBundle/Entity/EntityOne (...), 
) 

ich würde erwarten, oder wie eine mehrdimensionale Array haben:

Array(
[0] => Array(
    [0] /AppBundle/Entity/EntityOne, 
    [1] /AppBundle/Entity/EntityTwo, 
    [2] /AppBundle/Entity/EntityThree 
), 
[1] => . . . 
) 

Die Ergebnisse sind nicht von Zeile verwendet. Noch sind sie in einer vorhersagbaren Reihenfolge, dass ich sie mit gruppieren kann mit array_chunk()

Die generierte SQL läuft gut. Die DQL liefert genaue Ergebnisse - sie sind einfach nicht so formuliert, wie ich es erwarten würde. Ich verfolge Doctrines (schwer) Dokumentation über eager loading verbindet:

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

Diese Frage ist sehr ähnlich zu

Doctrine DQL returns multiple types of entities

Aber meine wählen Auftrag ist anders als meine Join-Tabellen sind viel zu viele. Vielen Dank!

Eine Variante dieser Frage gestellt wurde:

Getting Doctrine DQL results the SQL way

Ich bin ziemlich überrascht, dass Lehre über Join-Tabelle nicht eifrig Laden nicht unterstützt.

+0

eifrig Laden nutzen zu können, wählen Sie müssen e1 nur und nicht e1, e2 und e3. – Alsatian

+0

yeah, e1 hat keinen Fremdschlüsselbezug auf irgendeinem Tisch. Ich könnte einen Teil des Weges bekommen, indem ich 'e1_2' wähle, aber dann verliere ich die Beziehung zu' e3'. – eggmatters

Antwort

1

Hier ist das Beste, was ich tun konnte:

//in my entity repository: 
public function getFoo($hydrate = true) { 
    $sql = "SELECT e1, e2, e3 FROM entity_one 
      JOIN entity_one_entity_two e1_2 ON e1_2.entity_one_id = e1.id 
      JOIN entity_two e2 ON e1_2.entity_two_id = e2.id 
      JOIN entity_one_entity_three e1_3 ON e1_3.entity_one_id = e1.id 
      JOIN entity_three e3 ON e3.id = e1_3.entity_three.id 
      WHERE e1.some_field IN ('some','values','in','e1')"; 
    $stmt = $con->prepare($sql); 
     $stmt->execute(); 
    return ($hydrate) 
    ? $this->hydrateResponses($stmt->fetchAll(PDO::FETCH_ASSOC)) 
     : $stmt->fetchAll(PDO::FETCH_ASSOC); 
} 

public function hyrdateResponses($responses) { 
    //call find by ids on repositories from array. 
} 

Dies funktioniert gut, weil Sie 3XN die Anzahl der Abfragen gerade ausführen, wenn Sie nur Ergebnisse zu erhalten von einem Versuch!

0

Anruf getScalarResult() statt getResult() auf Ihre Anfrage und Sie werden alle Felder aller verknüpften Tabellen zusammengefasst in einem Array pro Datensatz erhalten:

# Replace this call ... 
$query->getQuery()->getResult(); 
# ... by that call ... 
$query->getQuery()->getScalarResult(); 
Verwandte Themen