Assoziationen von Assoziationen mit dem QueryBuilder hinzufügen.

Ich habe 2 Models, wobei Model A eine OneToMany Assoziation auf Model B hat.

Model B hat eine Assoziation auf ein Media Model.

Wenn ich nun dem QueryBuilder von Model A wie folgt schreibe, bekomme ich die Daten von Model B. Was muss ich nun ändern, damit ich auch die Media Daten von den ganzen Model Bs bekomme?

    public function getAQuery($aID) {
        $builder = $this->getBrochureQueryBuilder($aID);
        return $builder->getQuery();
    }

    public function getAQueryBuilder($aID) {
        $builder = $this->getEntityManager()->createQueryBuilder()
            ->select(['a', 'bs'])
            ->from(A::class, 'a')
            ->leftJoin('a.bs', 'bs')
            ->where('a.id = :aId')
            ->setParameter('aId', $aID);
        return $builder;
    }

// für mit getArrayResult sinngemäß zu folgendem ergebnis.
a = [
  id => 1,
  bs => [
    [id => 101, a_id => 1, media_id => 105],
    [id => 102, a_id => 1, media_id => 109],
    [id => 103, a_id => 1, media_id => 117],
  ]
]

Ich möchte aber nun folgendes Ergebnis:

a = [
  id => 1,
  bs => [
    [id => 101, a_id => 1, media_id => 105, media: [ id => 105, path => '..', ...] ],
    [id => 102, a_id => 1, media_id => 109, media: [ id => 109, path => '..', ...] ],
    [id => 103, a_id => 1, media_id => 117, media: [ id => 117, path => '..', ...] ]
  ]
]

Auch mit fetch mode EAGER läd er die assoziationen nicht, sprich die spalte media_id ist da aber media nicht.

Hi langnickel,

wie du es bei Model B schon gemacht hast, musst du natürlich auch das Media-Model mit einem Join aufnehmen:

/* ... */
$builder = $this->getEntityManager()->createQueryBuilder()
    ->select(['a', 'bs', 'media']) // neu: media wird auch selektiert
    ->from(A::class, 'a')
    ->leftJoin('a.bs', 'bs')
    ->leftJoin('bs.media', 'media') // neu: leftJoin in die Media-Tabelle
    ->where('a.id = :aId')
    ->setParameter('aId', $aID);
/* ... */

Viele Grüße

strange, das war mein erster versuch und ich bekam ne exception als geschenk. ich probiers morgen gleich nochmal aus :slight_smile:

Oki, funktioniert :slight_smile: