Doctrine Join Anfänger Problem

Tommy57

Erfahrenes Mitglied
Hallo,

ich soll für ne Präsentation eine einfache Seite aufbauen und entschied mich für das Zend Framework 2 und DoctrineORM, um mich dabei etwas weiter zu bilden. Nun hänge ich aber bereits an einer Kleinigkeit fest.

Ich habe Entities für Kontinente, Länder und Fabriken, die die Tabellen 1 zu 1 abbilden. Die Tabellen sind wie folgt aufgebaut:
Code:
continent:
id, name
 
country:
id, name, continent_id
 
factory:
id, name, continent_id, country_id

Nun möchte ich gerne mit einer Abfrage wissen, wie viele Länder und Fabriken ein Kontinent besitzt und kriege das nicht hin.
SQL:
$query = $this->getEntityManager()->createQuery('SELECT 
                                                    c.id, 
                                                    c.name, 
                                                    COUNT(f.id) AS count 
                                                FROM 
                                                    Mapsearch\Entity\Country c 
                                                LEFT OUTER JOIN 
                                                    Mapsearch\Entity\Factory f 

                                                WHERE 
                                                    c.continent_id = :id
                                                GROUP BY
                                                    c.id,
                                                    c.name
                                                ORDER BY
                                                    c.name');
$query->setParameter('id', $id);
$countries = $query->getResult();

Das Problem ist, dass bei dem Join das "ON c.id = f.country_id" fehlt. Wenn ich das aber hinschreibe, bekomme ich eine Fehler Meldung beim "ON".

Kann mir vielleicht jemand sagen, wie ich das Statement ergänzen müsste, um den JOIN vernünftig umzusetzen.

Es wäre auch super, wenn mir jemand sagen könnte, wo ich mich in das Thema einarbeiten kann.

Gruß, Tommy
 
Zuletzt bearbeitet von einem Moderator:
Ich bin gerade per Zufall auf das entscheidene Schlüsselwort gestoßen. WITH statt ON.

SQL:
$query = $this->getEntityManager()->createQuery('SELECT 
                                                    c.id, 
                                                    c.name, 
                                                    COUNT(f.id) AS count 
                                                FROM 
                                                    Mapsearch\Entity\Country c 
                                                LEFT OUTER JOIN 
                                                    Mapsearch\Entity\Factory f 
                                                WITH
                                                    c.id = f.country_id
                                                WHERE 
                                                    c.continent_id = :id
                                                GROUP BY
                                                    c.id,
                                                    c.name
                                                ORDER BY
                                                    c.name');
$query->setParameter('id', $id);
$countries = $query->getResult();

Alternativ funktioniert auch diese Variante, die sich meiner Meinung nach besser lesen lässt:
SQL:
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('c.id, c.name, COUNT(f.id) AS count')
    ->from('Mapsearch\Entity\Country', 'c')
    ->leftJoin('Mapsearch\Entity\Factory', 'f', 'WITH', 'c.id = f.country_id')
    ->where('c.continent_id = :id')
    ->groupBy('c.id, c.name')
    ->orderBy('c.name', 'ASC');
$query = $qb->getQuery();
$query->setParameter('id', $id);
$countries = $query->getResult();

Gruß, Tommy
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück