2012-04-14 7 views
5

Ich habe meine zwei Klassen User und Role, und ich brauche, um ein QueryBuilder zu machen, die eine Abfrage für den Benutzer zurückgibt, die die ROLE_PROVIDER Rolle haben. Ich brauche dies für eine Entität Formularfeld in Symfony 2. In der Formularklassendefinition ich folgende Snippet für das genannte Feld habe:Lehre 2 in Symfony 2 - Filtern eine Querybuilder von einem Verein

$builder->add('provider', 'entity', array(
    'class' => 'ElCuadreAccountBundle:User', 
    'property' => 'username', 
    'query_builder' => function(UserRepository $ur) { 
         return $ur->getUsersByRoleQB('ROLE_PROVIDER'); 
         }, 
    'required' => true, 
)); 

Und dann in meiner Gewohnheit UserRepository Ich habe die folgende Funktion, die eine Rückkehr sollte QueryBuilder Objekt:

public function getUsersByRoleQB($role) { 
    $qb = $this->createQueryBuilder('u'); 
    return $qb->join('u.roles','r') 
       ->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 
       ->orderBy('u.username', 'ASC'); 
} 

natürlich funktioniert das nicht, aber ich klebte es meine Bedürfnisse zu illustrieren.

Ich habe mich umgesehen und es scheint Doctrine2 nicht nativ durch eine Zuordnung zu filtern. In this page sagen sie das und schlagen vor, DQL für diese Art der Filterung zu verwenden. Mein Problem ist, dass ich nicht gefunden habe, wie man ein QueryBuilder Objekt aus einem DQL Satz macht. Wenn Sie mir auch die richtige DQL Anfrage stellen könnten, wäre ich sehr dankbar ...

Danke für Ihre Hilfe!

Antwort

11

wo sollte eigentlich tun, was Sie wollen. Sie müssen nur die Syntax falsch ‚in‘:

Diese

->where($qb->expr()->in('r.role',$qb->expr()->literal($role))) 

sein sollte

->where($qb->expr()->in('r.role',$role)) 

Ich weiß es vielleicht ein bisschen seltsam erscheinen, aber da vorbereitete Anweisungen nicht direkt Arrays unterstützen, Parameter zu IN-Klauseln müssen immer einzeln maskiert werden (welche Doktrin das für Sie tut). Daher ist die Syntax etwas anders als für einen eq-Ausdruck, für den Literal benötigt wird.

Sie stellen eine gute Frage, weil ich nach Zuordnung filtern musste. Ich denke, dass D2.2 dies out-of-the-box zulassen wird. Ich habe nicht wirklich versucht, aber ich vermute, dass

$dql = 'a,b FROM whatever...'; // Don't start with SELECT 
$qb->select($dql); 
return $qb; 

wird, ohne tatsächlich funktionieren alle anderen Teile, solange Ihr Urlaub unter Angabe der tatsächlichen ‚SELECT‘ string aus dem $ dql. Ungetestet.

+0

Dank! wirklich vollständige Antwort ... Eine Frage, es ist nicht sehr mit der ursprünglichen Frage verwandt, aber hier gehe ich ... Ich habe mehrmals gelesen, dass neue Versionen von Symfony 2 und Doktrin 2 kommen, und die Menschen scheinen das Wissen zu haben Neue Funktionen, aber ich bin es leid, 'php bin/vendors install' auszuführen, und es wird weder Symfony noch Doktrin aktualisiert ... wie kann ich upgraden? oder wann würden diese neuen Versionen offiziell sein ??? Danke für deine Antwort!!! – Throoze

+0

Sie können über D2.2 hier nachlesen: http://www.doctrine-project.org/. S2 wird D2.2 nicht integriert haben, bis S2.1 veröffentlicht wird, wahrscheinlich in diesem Sommer. Sie können jedoch D2.2 direkt installieren, passen Sie Ihre Pfade in autoload.php an und in den meisten Fällen sollte Ihr Doktrin-Code funktionieren. Überprüfen Sie die Dokumente auf Dinge, auf die Sie achten sollten. – Cerad

+0

Danke für Ihre Antworten! – Throoze

3

noch einfacher noch können Sie tun:

->where('r.role IN (:role)') 
->setParameter('role', $role); 

Das finde ich viel besser lesbar als Zugabe die $ qb-> expr() ...