2013-04-27 18 views
14

Ich lost Trilion Stunden google dies, aber keine der Lösungen waren gut.Symfony2 Doctrine QueryBuilder wo IN

Ich habe diese Querybuilder:

 $qb2=$this->createQueryBuilder('s') 
     ->addSelect('u') 
     ->innerJoin('s.user','u') 
     ->where("u.id IN(:followeeIds)") 
     ->andWhere('s.admin_status = false') 
     ->setParameter('user', $user) 
     ->setParameter('followeeIds', $arrayFolloweeIds) 
     ->orderBy('s.id','DESC') 
     ->setMaxResults(15) 
    ; 

ich eine zweite Abfrage tun könnte und dann wie $qb->getDQL() tun, aber hätte ich die Abfrage-Cache?

Fehler:

Invalid parameter number: number of bound variables does not match number of tokens 

Antwort

47

Sie den Benutzerparameter einstellen, aber ich sehe es nicht überall in der Abfrage verwendet werden?

Auch hatte ich Probleme mit WHERE IN und Lehre QueryBuilder mit Arrays würde mir einen ähnlichen Fehler geben, und seltsam genug Lauf array_values, bevor die Parameterbindung schien auch diese Probleme zu lösen.

Versuchen:

$qb2=$this->createQueryBuilder('s') 
     ->addSelect('u') 
     ->innerJoin('s.user','u') 
     ->where("u.id IN(:followeeIds)") 
     ->andWhere('s.admin_status = false') 
     ->setParameter('followeeIds', array_values($arrayFolloweeIds)) 
     ->orderBy('s.id','DESC') 
     ->setMaxResults(15) 
    ; 
+2

omg ich der Benutzer das Gefühl, so dumm ... natürlich hilft! Ich habe es nicht bemerkt ... und ja, die Array-Werte haben geholfen! Und nun endlich magisch arrayFolloweeIds = implodieren ("',", $ arrayFolloweeIds) ... ich hoffe, die Leute werden es finden. Danke ! – EnchanterIO

+0

'array_values' hat mir auch geholfen. Aber warum? Ich habe ein indiziertes Array verwendet. Auf der anderen Seite funktionierte es mit einer Löschabfrage ohne 'array_values'. Ich benutze Doktrin/Orm v2.5.4 – alpham8

+0

Ich denke, das Problem wird durch einen numerischen Index in der Reihenfolge der Array oder möglicherweise String numerische Indizes verursacht. Nicht 100% sicher, aber wenn das der Fall ist, warum array_values ​​funktioniert, weil es Ihnen ein neues Array richtig indiziert gibt –

0

In Symfony2.8 das folgende Beispiel mich

... 
$qb2->where(
    $qb2->expr()->in('u.id', ':ids') 
) 
->setParameter('ids', $ids_array) 
... 
+0

nett, BTW @young ist es eine schlechte Praxis, eine Variable basierend auf ihrem Wert zu nennen. ZB "array", "string". Ein sinnvoller Name ist mehr als genug: $ IDs für eine Liste von IDs und $ ID, wenn es nur eine einzige ganze Zahl ist :) – EnchanterIO

+0

Danke, @EnchanterIO. Ich stimme in diesem Fall zu. Aber PHP unterstützt keinen expliziten Typ. Wie kann ich also wissen, welche Art von Variablen verwendet werden? Als Beispiel habe ich eine Liste von ganzen Zahlen getrennt durch ein Komma oder ein Array von session_keys? Können Sie gewichtigere Argumente geben? Danke :) –

+0

sicher. Wenn Sie eine Liste von Ganzzahlen haben, die durch ein Komma getrennt sind, dann haben Sie kein Array, Sie haben eine Zeichenkette. So würde ich es nennen: commaConcatinatedIds. Und zu PHP 7 migrieren, um strenge Typen zu erhalten;) Wenn Sie weitere Fragen haben, können Sie mich auf Twitter erreichen: https://twitter.com/EnchanterIO – EnchanterIO

Verwandte Themen