2010-12-27 9 views
9

Hier ist die dql-AbfrageWie mit „IN“ in WHERE-Klausel in Doctrine2

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

beschäftigen, wenn ich Parameter durch setParameter Lehre passieren nur das erste Ergebnis zurückgibt, aber wenn ich sie direkt in die dql -query es gibt 2 Ergebnisse (das ist richtig):

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

Wie mit "iN" in WHERE-Klausel durch setParameter umgehen?

Antwort

0

Lösung 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(); 

Lösung 2 (elegantere):

$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

Die folgende Beschreibung ist (für eine beliebige numer von Argumenten für die IN Klausel) wie erwartet

$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

Folgendes sollte gut funktionieren:

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

Sie können ein Array übergeben, ohne implode() zu verwenden und Doktrin wird es richtig behandeln (als eine Liste von ganzen Zahlen).

Hinweis: Wenn Sie bereits mit der Zeichenfolge '108919, 108920' arbeiten, müssen Sie die Funktionen zum Explodieren und Trimmen verwenden.

Dies auch hier erwähnt wird: How to use the in statement in DQL in Doctrine 2.0

+0

Dies funktioniert für mich und so würde ich annehmen, auf diese Frage ist die richtige Antwort Dies funktioniert. –

+0

asker sollte dies akzeptiert haben .. danke für die Antwort .. :) – ihsan

9

Beachten Sie, dass dies nur funktioniert, für nummerierte Parameter und Parameter nicht genannt.

$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

Ich riss mir die Haare aus versuchen, herauszufinden, warum ich Array-Parameter nicht funktionieren konnte - Ersetzen benannter Parameter mit nummerierten gespeichert mein Tag :-) –

+1

Ich bin gerade auf diese Frage gestoßen und habe es trotzdem mit einem benannten Parameter versucht. Scheint irgendwo zwischen dieser Antwort und jetzt, Doctrine wurde geändert, um diese Konstruktion auch für benannte Parameter zu ermöglichen. –

0

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

}