2016-08-02 16 views
0

Gibt es eine Möglichkeit, dies zu tun. Ich werde immer verwirrter und versuche verschiedene Dinge.Doktrin links beitreten auf nicht verwandten Einheit

Ich habe eine Entität Konferenzen, die einen Platz haben können. Orte sind in einer Beziehung von Mensch zu Mensch mit der Stadt.

In meiner Abfrage versuche ich die Stadt Informationen abrufen, aber es kann nicht scheinen, um es an der gleichen Stelle Ergebnis abrufen. Dies ist die Abfrage verwendet:

$qbt = $this->_em->createQueryBuilder(); 
$qbt 
    ->select('conference', 'diffusion', 'speaker', 'placediff', 'confcity') 
    ->from('AppBundle:Conference', 'conference') 
    ->leftJoin('conference.diffusion', 'diffusion') 
    ->leftJoin('conference.speaker','speaker') 
    ->leftJoin('conference.place','placediff') 
    ->leftJoin('AppBundle:City', 'confcity', 'WITH', 'confcity.id = placediff.city'); 

return $qbt 
    ->getQuery() 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true) 
    ->useQueryCache(true) 
    ->useResultCache(true, 3600) 
    ->getArrayResult(); 

Dies ist, was zurückkehrt ist, die derzeit nur eine Konferenz haben. Würde gerne das zweite Array innerhalb des Ortes haben.

query result

Alle Ideen, wie dies zu erreichen? Viel verpflichtet ~

(UPDATE) In der Zwischenzeit hat ich die rohe SQL-Abfrage eingeschaltet, aber wirklich nach einem Weg, dies zu tun dql mit

public function rawConf() 
    { 
     $conn = $this->getEntityManager()->getConnection(); 
     $sql = 'SELECT 
    c0_.id AS id, 
    c0_.startAt AS startat, 
    c0_.comment AS comment, 
    d1_.id AS diffusion_id, 
    d1_.hour AS diffusion_hour, 
    s2_.id AS speaker_id, 
    c0_.place_id AS place_id, 
    c0_.sponsor_id AS sponsor_id, 
    c0_.tour_id AS tour_id_8, 
    d1_.movie_id AS diffusion_movie_id, 
    s2_.contact_id AS speaker_contact_id, 
    c6_.name AS ville_name, 
    c6_.postal AS ville_post, 
    c6_.department as ville_depart 
FROM 
    conference c0_ 
    LEFT JOIN conference_diffusion c3_ ON c0_.id = c3_.conference_id 
    LEFT JOIN diffusion d1_ ON d1_.id = c3_.diffusion_id 
    LEFT JOIN conference_speaker c4_ ON c0_.id = c4_.conference_id 
    LEFT JOIN speaker s2_ ON s2_.id = c4_.speaker_id 
    LEFT JOIN place p5_ ON c0_.place_id = p5_.id 
    LEFT JOIN city c6_ ON (c6_.id = p5_.city_id)'; 

     $stmt = $conn->prepare($sql); 

     $stmt->execute(); 

     return $stmt->fetchAll(); 

    } 
+0

Update => Offenbar kann das Ergebnis als> getResult (\ Doctrine \ ORM \ Query :: HYDRATE_SCALAR) zurückgeben und es führt alle Eigenschaften zusammen. Alles was mir bewusst sein sollte? –

+0

Hmm nein, die SCALAR HYDRATE dupliziert die Spalten –

+0

Veröffentlichen Sie Ihre Updates im ursprünglichen Beitrag, indem Sie sie nicht kommentieren. Auch Ihr Bild ist zu klein, um zu verstehen, was dort geschrieben ist. Sie können beschnittenes Bild hier posten oder ein Vorschaubild hochladen, das mit dem Bild in voller Größe verlinkt ist. Sie können diese Ausgabe aber auch im Post-Body veröffentlichen. –

Antwort

0

Sie sollten „Stadt“ von „Ort“ als „$ erhalten Stadt "ist eine Eigenschaft von Place entity. Versuchen Sie diese vereinfachte Abfrage, um zu sehen, wie es funktioniert:

$qbt = $this->_em->createQueryBuilder(); 
$qbt 
    ->select('conference') 
    ->addSelect('place') 
    ->addSelect('city') 
    ->from('AppBundle:Conference', 'conference') 
    ->innerJoin('conference.place', 'place') 
    ->innerJoin('place.city', 'city') 
; 

Und wenn es funktioniert - Sie könnten leicht weitere Joins hinzufügen, wenn Sie brauchen.

Verwandte Themen