2010-12-27 4 views
9

Ecco la DQL-queryCome trattare con "IN" in WHERE clausola in Doctrine2

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

se mi passa i parametri attraverso setParameter dottrina restituisce solo primo risultato, ma se ho messo direttamente nel DQL -query restituisce 2 risultati (questo è corretto):

$dql = "SELECT t Entities\Table t WHERE t.field1 IN (108919,108920)"; 

Come comportarsi con "iN" in WHERE clausola attraverso setParameter?

risposta

0

Soluzione 1:

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

Soluzione 2 (più elegante):

$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

segue dovrebbe funzionare come previsto (un numer arbitrario di argomenti della clausola IN)

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

che segue dovrebbe funzionare bene:

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

È possibile passare in un array, senza utilizzare implode() e doctrine lo gestirà correttamente (come un elenco di numeri interi).

Nota: se si sta già lavorando con la stringa '108919, 108920' - è necessario utilizzare le funzioni di esplodere e di assetto.

Questo è menzionato anche qui: How to use the in statement in DQL in Doctrine 2.0

+0

Questo funziona per me e quindi mi avrebbe assunto è la risposta corretta a questa domanda. –

+0

richiedente avrebbe dovuto accettare questo .. grazie per la risposta .. :) – ihsan

9

essere consapevoli del fatto che questo funziona solo per i parametri numerati, e parametri non denominati.

$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

stavo strappando i capelli cercando di capire il motivo per cui non ho potuto ottenere parametri array di lavorare - la sostituzione parametro denominato numerato salvato la mia giornata :-) –

+1

Ho appena trovato questa domanda e l'ho comunque provata con un parametro chiamato. Sembra che da qualche parte tra questa risposta e ora, Doctrine sia stato modificato per consentire questa costruzione anche per i parametri denominati. –

0

Questo è il lavoro

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

}