2010-12-27 12 views
9
İşte

WHERE-yan tümcesinde "IN" başa Nasıl setParameter doktrini aracılığıyla parametreler sadece ilk sonuç döndürür geçirirseniz DQL-sorguDoctrine2

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; 
    $q = $em->createQuery($dql) 
       ->setParameter(1, '108919,108920'); 
    $result = $q->execute(); 

olmakla ı DQL bunları doğrudan koyarsanız o 2 sonuç (bu doğru) döndürür -sorgu:

setParameter yoluyla NEREDE-yan tümcesinde "iN" nasıl çözülür?
$dql = "SELECT t Entities\Table t WHERE t.field1 IN (108919,108920)"; 

?

cevap

0

Çözelti 1: 2 (daha şık)

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1, ?2)"; 
$q = $em->createQuery($dql) 
->setParameters(array(1 =>'108919', 2 => '108920')); 
$result = $q->execute(); 

Çözüm:

$parameters = array(1 =>'108919', 2 => '108920'); 
$dql = 'SELECT t Entities\Table t WHERE t.field IN (?'.implode(', ?', array_keys($parameters)).')'; 
$q = $em->createQuery($dql) 
->setParameters($parameters); 
$result = $q->execute(); 
1

beklendiği gibi

$params = array(1 => 108919, 2 => 108920); 
$qb = $em->createQueryBuilder(); 
$qb->select(array('t')) 
    ->from('Entities\Table', 't') 
    ->where($qb->expr()-> in('t.field', array_map(function($p) { return '?'.$p; }, array_keys($params))) 
    ->setParameters($params); 
$q = $qb->getQuery(); 
$r = $q->getResult(); 
( IN maddesi argümanların rastgele bir numer için) çalışmalıdır aşağıdaki
6

şu sorunsuz çalışır:

$searchParameters = array(108919, 108920); 

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; 
$q = $em->createQuery($dql) 
    ->setParameter(1, $searchParameters); 

$result = $q->execute(); 

Sen (tamsayılar listesi olarak) düzgün idare edecek çöktüğünü() ve doktrin kullanmadan, bir dizideki geçebilir.

Not: Daha önce dize '108919, 108920' çalışıyorsanız - patlayabilir ve Döşeme işlevlerini kullanmak gerekecektir.

Bu ayrıca belirtilmiştir: How to use the in statement in DQL in Doctrine 2.0

+0

çalışıyor ve böylece ben varsayılabilir Bu sorunun doğru cevabıdır. –

+0

asker cevap bu .. teşekkürler kabul etmiş olmalıdır .. :) – ihsan

9

farkında olun ki bu numaralı parametreler için sadece eserleri değil, adlandırılmış parametreleri.

$searchParameters = array(108919, 108920); 

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; 
$q = $em->createQuery($dql) 
    ->setParameter(1, $searchParameters); 

$result = $q->execute(); 
+2

Ben dizi parametreler çalışmaya alamadım neden anlamaya çalışıyorum olsam deliye oldu - –

+1

:-) günümü kurtardı sayılı adlandırılmış parametreyi değiştirerek Ben sadece bu soruya rastladım ve yine de adlandırılmış bir parametre ile denedim. Bu cevabın arasında bir yer gibi görünüyor ve şimdi, doktrin, bu yapılandırmanın adlandırılmış parametrelere de izin vermesi için değiştirildi. –

0

Bu Bu benim için çalışıyor

public function searchCategory($target){ 

     $query = $this->getEntityManager() 
        ->createQuery("SELECT ct.id as id,ct.name as name, ct.target as target FROM LoveThatFitAdminBundle:ClothingType ct WHERE ct.target IN (:target)") 
        ->setParameter('target',$target['target']); 
        try { 
        return $query->getResult(); 
       } catch (\Doctrine\ORM\NoResultException $e) { 
       return null; 
       } 

}