2012-04-14 21 views
5

Tôi có hai lớp học UserRole và tôi cần phải thực hiện một QueryBuilder trả về truy vấn cho người dùng có vai trò ROLE_PROVIDER. Tôi cần điều này cho một lĩnh vực hình thức thực thể trong Symfony 2. Trong định nghĩa Mẫu Class I có đoạn mã sau cho lĩnh vực được đề cập:Doctrine 2 trong Symfony 2 - Lọc một QueryBuilder bởi một hiệp hội

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

Và sau đó trong Tuỳ chỉnh của tôi UserRepository tôi có chức năng sau đây, mà phải trả lại một QueryBuilder đối tượng:

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'); 
} 

Tất nhiên điều này không hiệu quả, nhưng tôi đã dán nó để minh họa nhu cầu của tôi.

Tôi đã xem xét xung quanh và có vẻ như Doctrine2 không hỗ trợ lọc nguyên bản theo liên kết. Trong số this page, họ nói như vậy và đề xuất sử dụng DQL cho loại lọc này. Vấn đề của tôi là tôi đã không tìm thấy cách tạo một đối tượng QueryBuilder từ một câu DQL. Nếu bạn cũng có thể cung cấp cho tôi quyền truy vấn DQL phù hợp, tôi sẽ rất biết ơn ...

Cảm ơn sự giúp đỡ của bạn!

Trả lời

11

nơi thực sự nên thực hiện những gì bạn muốn. Bạn chỉ có cú pháp sai cho 'trong':

này

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

Nên

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

Tôi biết nó có vẻ hơi lạ nhưng kể từ khi tuyên bố chuẩn bị không hỗ trợ trực tiếp mảng, các tham số cho mệnh đề IN luôn luôn phải được thoát riêng lẻ (học thuyết nào làm cho bạn). Do đó cú pháp là một chút khác nhau sau đó nói cho một biểu thức eq nơi chữ là bắt buộc.

Bạn nêu lên một câu hỏi hay vì tôi cần lọc theo liên kết. Tôi nghĩ D2.2 sẽ cho phép điều này ra khỏi hộp. Tôi chưa thực sự thử nhưng tôi nghi ngờ rằng

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

sẽ thực sự hoạt động mà không chỉ định bất kỳ phần nào khác miễn là bạn để nguyên chuỗi 'SELECT' thực tế ra khỏi $ dql. Chưa được kiểm tra.

+0

Cảm ơn! câu hỏi thực sự hoàn chỉnh ... Một câu hỏi, nó không liên quan lắm đến câu hỏi ban đầu, nhưng ở đây tôi đi ... Tôi đã đọc nhiều lần rằng các phiên bản mới của symfony 2 và học thuyết 2 đang đến, và mọi người dường như có kiến ​​thức về các tính năng mới, nhưng tôi mệt mỏi khi chạy 'php bin/vendor install', và nó không nâng cấp cả symfony hay doctrine ... làm thế nào tôi có thể nâng cấp? hoặc khi nào những phiên bản mới đó sẽ chính thức? cảm ơn câu trả lời của bạn!!! – Throoze

+0

Bạn có thể đọc thêm về D2.2 tại đây: http://www.doctrine-project.org/. S2 sẽ không có tích hợp D2.2 cho đến khi S2.1 được phát hành, có lẽ vào mùa hè này. Tuy nhiên, bạn có thể cài đặt trực tiếp D2.2, điều chỉnh đường dẫn của bạn trong autoload.php và, đối với hầu hết các phần, mã học thuyết của bạn sẽ hoạt động. Kiểm tra tài liệu để biết những điều cần chú ý. – Cerad

+0

Cảm ơn câu trả lời của bạn! – Throoze

3

thậm chí đơn giản hơn bạn vẫn có thể làm:

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

Tôi tìm thấy điều này nhiều hơn nữa rõ ràng hơn thêm $ qb-> expr() ...

Các vấn đề liên quan