2010-12-27 19 views
9

Aquí es el DQL-consulta¿Cómo lidiar con "IN" en la cláusula WHERE en Doctrine2

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

si paso parámetros a través de la doctrina setParameter devuelve sólo el primer resultado, pero si las puse directamente en el DQL -query devuelve 2 resultados (esto es correcto):

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

¿Cómo lidiar con "IN" en la cláusula WHERE a través setParameter?

Respuesta

0

Solución 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(); 

Solución 2 (más 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

El siguiente debe funcionar como se espera (para un numer arbitrario de argumentos a la cláusula de 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

Lo siguiente debería funcionar bien:

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

Puede pasar una matriz, sin utilizar implode() y doctrine lo manejará correctamente (como una lista de enteros).

Nota: si ya está trabajando con la cadena '108919, 108920', necesitará usar las funciones de explosión y recorte.

Esto también se menciona aquí: How to use the in statement in DQL in Doctrine 2.0

+0

Esto funciona para mí y así me asumiría es la respuesta correcta a esta pregunta. –

+0

asker debería haber aceptado esto ... gracias por la respuesta .. :) – ihsan

9

Tenga en cuenta que esto sólo funciona para los parámetros numeradas, y los parámetros que no se citan.

$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

Estaba desgarrándome tratando de descubrir por qué no podía conseguir que los parámetros de la matriz funcionaran - reemplazando el parámetro con el nombre guardado numerado mi día :-) –

+1

Acabo de encontrar esta pregunta y lo intenté con un parámetro nombrado de todos modos. Parece que en algún lugar entre esta respuesta y ahora, Doctrine fue cambiada para permitir también esta construcción para los parámetros nombrados. –

0

Esto está trabajando

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

}