2016-09-27 3 views
2

Ich habe eine Tabelle von Beiträgen, die viele auf eine Tabelle von Autoren bezogen sind. Beide Tabellen beziehen sich auf eine dritte Tabelle (likes), die angibt, welche Benutzer welche Beiträge gemocht haben. Ich möchte die Autoren und Likes mit den Posts auswählen, weiß aber nicht, wie ich nach dem Abrufen der Ergebnisse auf die verbundenen Objekte zugreifen kann. Meine Query Builder sieht wie folgt aus:Doctrine/Symfony Query Builder hinzufügen Auswahl auf linken Join

$result = $em->createQueryBuilder() 
      ->select('p')    
      ->from('Post', 'p') 
      ->leftJoin('p.author', 'a') 
      ->leftJoin('p.likes', 'l', 'WITH', 'l.post_id = p.id AND l.user_id = 10') 
      ->where("p.foo = bar") 
      ->addSelect('a AS post_author') 
      ->addSelect('l AS post_liked') 
      ->getQuery()->getResult(); 

Im oben, der Autor wird immer gültig sein, wo dergleichen Wert null sein kann, wenn der anfragende Benutzer (Benutzer 10 im Beispiel) hat sich mit der Post nicht interagierte. Die Abfrage funktioniert gut, aber ich kann nicht auf die Daten für die Aliase post_author oder post_liked zugreifen. Die resultierenden Daten sehen wie folgt aus:

[ 
    [0] => Doctrine PostEntity, 
    [1] => Doctrine PostEntity, 
    ... 
] 

ich etwas möchte, die mehr wie folgt aussehen:

[ 
    [0] => ['post' => Doctrine PostEntity, 
      'post_author' => Doctrine UserEntity, 
      'post_liked' => Doctrine LikeEntity], 
    [1] => ['post' => Doctrine PostEntity, 
      'post_author' => Doctrine UserEntity, 
      'post_liked' => Doctrine LikeEntity], 
    ... 
] 

Wäre ich nur versuchen, den Autor zu laden, in Ordnung sein würde, weil ich nicht laden der Autorwert aus dem geladenen Post (Doctrine hydratisiert das Objekt automatisch mit ausgewählten Join-Daten aus der Author-Tabelle). Zum Beispiel:

Das Problem tritt auf, wenn ich versuche, ein Like für den aktuellen Benutzer zu laden. Beispiel:

$post = $result[0]; 
$like = $post->getLike(); // INVALID - there's no property "like" on Post 
$likes = $post->getLikes(); // valid, but loads the whole collection 
$like = $post->post_liked; // INVALID - the SQL alias is not a valid object property 

Wie greife ich auf die in der Abfrage angegebenen Daten zu?

+0

Hast du '' select ('p', 'a', 'l') ''? –

+0

Ich glaube, was Sie versuchen, ist nicht möglich, wenn Sie mit Entitäten arbeiten. Es ist jedoch möglich, wenn Sie in diesem Fall mit Arrays arbeiten möchten. Verwenden Sie dazu '-> getArrayResult()'. –

+0

@EmanuelOster getArrayResult() schaut näher, aber ich sehe immer noch post_author oder post_liked Schlüssel nicht. Gibt es eine Möglichkeit, Join-Tabellen als Aliase auszuwählen? – CaptainStiggz

Antwort

0

Ich endete mit $query->getArrayResults(), die ein Array mit Sammlungen auf der Grundlage der Assoziationsnamen in Doktrin-Konfiguration auffüllt. Das Schlüsselwort AS in der Abfrage dient nur als Hook für die Abfrage selbst, nicht für die Ausgabe-Array-/Entity-Hydration.

Eine vollständige Lösung mit Beispielen finden Sie in meiner answer here.