2013-04-27 27 views
14

Tôi mất thời gian trilion google nhưng không có giải pháp nào tốt.Symfony2 Trình quản lý truy vấn của Doctrine trong đó IN

Tôi có querybuilder này:

 $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) 
    ; 

tôi có thể làm một truy vấn thứ hai và sau đó làm như $qb->getDQL() nhưng tôi sẽ cache truy vấn?

Lỗi:

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

Trả lời

47

Bạn đang thiết lập các tham số người dùng nhưng tôi không nhìn thấy nó đang được sử dụng trong truy vấn ở đâu không?

Ngoài ra tôi gặp sự cố với WHERE IN và Doctrine QueryBuilder với mảng sẽ cung cấp cho tôi lỗi tương tự và chạy đủ array_values trước khi ràng buộc tham số dường như cũng giải quyết được các vấn đề đó.

Hãy thử:

$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 tôi cảm thấy thật ngu ngốc ... tất nhiên người sử dụng! tôi đã không nhận thấy nó ... và có array_values ​​đã giúp! Và bây giờ cuối cùng ma thuật làm việc $ arrayFolloweeIds = implode ("','", $ arrayFolloweeIds) cũng ... tôi hy vọng mọi người sẽ tìm thấy nó. cám ơn ! – EnchanterIO

+0

'mảng_values' cũng giúp tôi. Nhưng tại sao? Tôi đã sử dụng một mảng được lập chỉ mục. Và mặt khác, với một truy vấn xóa nó làm việc mà không có 'mảng_values'. Tôi đang sử dụng doctrine/orm v2.5.4 – alpham8

+0

Tôi nghĩ rằng vấn đề được gây ra bởi một chỉ số số thứ tự trên mảng hoặc có thể có chỉ mục chuỗi số. Mặc dù không chắc chắn 100% nhưng nếu đó là lý do tại sao array_values ​​hoạt động vì nó cung cấp cho bạn một mảng mới được lập chỉ mục đúng cách –

0

Trong Symfony2.8 ví dụ sau đây giúp tôi

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

tốt đẹp, BTW @young, đó là một thực tế không tốt để đặt tên biến dựa trên giá trị của nó. Ví dụ: "mảng", "chuỗi". Một tên có ý nghĩa là quá đủ: $ id cho danh sách các ID và $ id nếu nó chỉ là một số nguyên duy nhất :) – EnchanterIO

+0

Cảm ơn, @EnchanterIO. Tôi đồng ý trong trường hợp này. Nhưng PHP không hỗ trợ loại rõ ràng. Vậy làm cách nào tôi có thể biết loại biến nào đang sử dụng? Ví dụ, tôi có một danh sách các số nguyên được phân tách bằng dấu phẩy hoặc mảng của session_keys? Bạn có thể đưa ra nhiều đối số nặng hơn không? Cảm ơn :) –

+0

chắc chắn. Nếu bạn có một danh sách các số nguyên được phân tách bằng dấu phẩy thì bạn không có mảng, bạn có một chuỗi. Vì vậy, tôi sẽ gọi nó là: commaConcatinatedIds. Và chuyển sang PHP 7 để có được các loại nghiêm ngặt;) nếu bạn có thêm câu hỏi, bạn có thể liên hệ với tôi trên twitter: https://twitter.com/EnchanterIO – EnchanterIO