2012-04-14 8 views
5

bir QueryBuilder filtreleme. Ben şu sözü alan için pasajı var Formu Sınıf tanımda Symfony'de 2. bir varlık formu alanı için bu gerekir: Benim Custom UserRepository sonraDoktrini 2 - Benim iki sınıfları <code>User</code> ve <code>Role</code> var ve ben <code>ROLE_PROVIDER</code> role sahip kullanıcılar için bir sorgu döndüren bir <code>QueryBuilder</code> yapmak gerekir bir dernek

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

oysa benim bir dönmelidir aşağıdaki fonksiyonu, QueryBuilder nesnesi:

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

tabii bu işe yaramazsa, ama benim ihtiyaçlarını getirmek için o yapıştırılan.

Etrafa baktım ve Doctrine2 bir ilişkilendirmeyle doğal olarak filtrelemeyi desteklemiyor gibi görünüyor. this page'da, bu tür bir filtreleme için DQL kullanmanızı öneririz. Benim sorunum, DQL cümlesinden QueryBuilder nesnesini nasıl oluşturduğumu bulamadım. Eğer bana doğru DQL sorgusu sağlayabilirseniz, ben çok minnettar olurum ...

Yardımlarınız için teşekkürler!

cevap

11

Gerçekte istediğiniz şeyi yapmalısınız. ,

Bu

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

Ben doğrudan diziler desteklemeyen garip ama hazırlanan tabloların beri biraz görünebilir biliyorum

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

olmalı: Sadece 'in' yanlış sözdizimi var IN cümleleri için parametrelerin her zaman bireysel olarak kaçması gerekir (bu sizin için doktrin yapar). Bu nedenle sözdizimi biraz farklıdır ve ardından, değişmezin gerekli olduğu bir eq ifadesi için söyleyin.

İyi bir soru ortaya atıyorsunuz çünkü ilişkilendirerek filtrelemem gerekiyor. D2.2'nin bu kutunun dışında olmasına izin vereceğini düşünüyorum. Gerçekten denemedim ama

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

aslında $ DQL dışına izinli olduğu sürece gerçek 'SEÇ' dizesini başka parçalar belirtmeden çalışacağını sanıyorum. Test edilmemiş.

+0

teşekkürler! Gerçekten tam bir cevap ... Bir soru, orijinal soruyla çok ilgili değil, ama ben gidiyorum ... Symfony 2 ve doktrin 2'nin yeni sürümlerinin geldiği birkaç kez okudum ve insanlar yeni özellikler, ama 'php bin/vendors install' çalıştırmayı denemekten yoruldum ve ne symfony ne de doktrini yükseltmiyor ... nasıl yükseltebilirim? ya da bu yeni sürümler ne zaman resmi olacak? Cevabınız için teşekkürler!!! – Throoze

+0

D2.2 hakkında buradan bilgi alabilirsiniz: http://www.doctrine-project.org/. S2, muhtemelen S2.1 yayınlanana kadar D2.2'ye sahip olmayacak, muhtemelen bu yaz. Ancak, D2.2'yi doğrudan yükleyebilir, autoload.php'deki yollarınızı ayarlayabilirsiniz ve çoğu zaman doktrin kodunuz çalışmalıdır. Dikkat edilmesi gereken şeyler için dokümanlar kontrol edin. – Cerad

+0

Yanıtlarınız için teşekkürler! – Throoze

3

daha da basit hala yapabilirsiniz:

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

Bunu çok daha okunaklı eklemekten daha bulmak $ qb-> expr() ...

İlgili konular