2013-04-27 23 views
14

Straciłem kilka godzin w google, ale żadne z rozwiązań nie było dobre.Konstruktor zapytań Symfony2 Doctrine gdzie IN

mam ten 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) 
    ; 

mogę zrobić drugą kwerendę, a następnie wykonaj jak $qb->getDQL() ale chciałbym buforują kwerendy?

Błąd:

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

Odpowiedz

47

ustawiania parametrów użytkownika, ale nie widzę go używanego w zapytaniu gdziekolwiek?

Również miałem problemy z WHERE IN i Nauki QueryBuilder z tablicami da mi podobny błąd i działa dość dziwnie array_values przed wiążące parametr wydawało się rozwiązać te problemy, jak również.

Spróbuj:

$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 czuję się tak głupio ... oczywiście użytkownik! nie zauważyłem tego ... i tak pomogły wartości array_! A teraz wreszcie magicznie działające $ arrayFolloweeIds = implode ("','", $ arrayFolloweeIds) również ... mam nadzieję, że ludzie to znajdą. dzięki ! – EnchanterIO

+0

'array_values' również mi pomogło. Ale dlaczego? Używałem tablicy indeksowanej. Z drugiej strony, z kwerendą usuwania działało bez 'array_values'. Używam doctrine/orm v2.5.4 – alpham8

+0

Myślę, że problem jest spowodowany przez indeks numeryczny poza kolejnością w tablicy lub ewentualnie posiadający indeksy liczbowe. Nie jest to jednak w 100% pewne, ale jeśli tak jest, to dlatego wartości array_values ​​działają, ponieważ daje to nową poprawnie indeksowaną tablicę –

0

W Symfony2.8 następujący przykład pomaga mi

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

nice, BTW @young niewłaściwą praktyką jest nazywanie zmiennej na podstawie jej wartości. E.g "tablica", "ciąg". Wymowna nazwa jest więcej niż wystarczająca: $ ids dla listy ID i $ id, jeśli to tylko jedna liczba całkowita :) – EnchanterIO

+0

Dzięki, @EnchanterIO. Zgadzam się w tej sprawie. Ale PHP nie obsługuje typu jawnego. Skąd mogę wiedzieć, który typ zmiennej jest używany? Jako przykład, mam listę liczb całkowitych oddzielonych przecinkiem lub tablicę kluczy sesji? Czy mógłbyś podać ważkie argumenty? Dzięki :) –

+0

pewnie. Jeśli masz listę liczb całkowitych oddzielonych przecinkiem, to nie masz tablicy, masz ciąg znaków. Tak nazwałbym to: commaConcatinatedIds. I migruj do PHP 7, aby uzyskać ścisłe typy;) jeśli masz więcej pytań, możesz skontaktować się ze mną na Twitterze: https://twitter.com/EnchanterIO – EnchanterIO