8 Stimmen

Doktrin 2 Unterabfrage

Ich möchte eine Subquery mit dem Query Builder implementieren, aber ich verstehe die Syntax nicht. Ich habe es mit einer Ortstabelle zu tun, deren Einträge je nach eingestelltem Ortstyp Städte, Staaten oder Postleitzahlen sein können. Ich möchte alle Orte, die in einem bestimmten Zustand sind und nehmen Sie alle, die Stadt-Typ sind und haben eine Bevölkerung unter einem bestimmten Betrag zu erhalten.

$qb->select('l')
->from('Entity\Location', 'l')
->where('l.state = :state')
->setParameter('state', 'UT')
->andWhere('...don't know what to put here');

Im undWo muss ich grundsätzlich sagen

und wo id nicht in (select id from location where location_type = 1 and population < 1000)

Update : Ich war in der Lage, dies mit gerade DQL zu tun, aber es wäre schön zu sehen, wie man es mit dem Query Builder zu tun.

$qb->andWhere('l.id NOT IN (SELECT l2.id FROM Entity\Location AS l2 WHERE l2.location_type = 1 AND l2.population < 1000)');

0 Stimmen

Es sieht so aus, als bräuchte ich nicht einmal eine Subquery. Guilherme schlug jedoch auch vor, dass ich einfach eine zweite Query Builder-Instanz verwenden kann und diese als zweites Argument eines in-Ausdrucks verwenden kann. groups.google.com/group/doctrine-user/browse_thread/thread/

4voto

Rene Terstegen Punkte 7711

In der Dokumentation von Doctrine habe ich dies gefunden:

// Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance

// Example - $qb->expr()->notIn('u.id', '2')
public function notIn($x, $y); // Returns Expr\Func instance

Es sollte möglich sein, eine Unterabfrage in diese Funktion einzufügen. Ich habe sie selbst nie benutzt, aber laut der Dokumentation sollte sie so aussehen.

$qb->select('l')
   ->from('Entity\Location', 'l')
   ->where('l.state = :state')
   ->setParameter('state', 'UT')
   ->andWhere($qb->expr()->notIn('u.id', 
       $qb->select('l2.id')
          ->from('Entity\Location', 'l2')
          ->where(l2.location_type = ?1 AND l2.population < ?2)
          ->setParameters(array(1=> 1, 2 => 1000))
));

Ich bin mir nicht zu 100 % sicher, dass das obige Beispiel korrekt ist, aber versuchen Sie es einmal.

0 Stimmen

Ich weiß, das ist wirklich alt, aber für jemanden, der über eine Suchmaschine darauf stößt (wie ich), hier ist, wie ich das zum Laufen gebracht habe: in() o notIn() Ausdrücke unterstützen keine QueryBuilder-Instanz, die an sie übergeben wird, aber sie unterstützen einen DQL-String. Dafür müssen Sie nur Folgendes hinzufügen ->getDQL() am Ende des Sub-Query-Codes. Achten Sie auch darauf, dass Sie einen separaten QueryBuilder für die Sub-Query verwenden müssen und nicht denselben QueryBuilder wiederverwenden können. $qb Instanz wie hier zu sehen. Ansonsten funktioniert es tatsächlich auf diese Weise.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X