2010-12-27 16 views
9

यहाँ में जहां-खंड में "में" से निपटने के लिए DQL-क्वेरीकैसे Doctrine2

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

अगर मैं setParameter सिद्धांत के माध्यम से मानकों को केवल पहले परिणाम देता है पारित है, लेकिन अगर मैं उन्हें DQL में सीधे डाल -query यह रिटर्न 2 परिणाम (यह सही है):

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

कैसे "में" setParameter के माध्यम से जहां-खंड में से निपटने के लिए?

उत्तर

0

समाधान 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(); 

समाधान 2 (अधिक सुरुचिपूर्ण):

$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

निम्नलिखित (IN खंड को युक्तियों के स्वेच्छाचारी numer के लिए) अपेक्षा के अनुरूप काम करना चाहिए

$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

निम्नलिखित ठीक काम करना चाहिए:

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

आप इंपोड() का उपयोग किए बिना एक सरणी में गुजर सकते हैं और सिद्धांत इसे ठीक से संभाल लेंगे (पूर्णांक की सूची के रूप में)।

नोट: यदि आप पहले से ही स्ट्रिंग '108919, 108920' के साथ काम कर रहे हैं - तो आपको विस्फोट और ट्रिम कार्यों का उपयोग करने की आवश्यकता होगी।

यह भी यहाँ उल्लेख किया जाता है: How to use the in statement in DQL in Doctrine 2.0

+0

यह मेरे लिए काम करता काम कर रहा है और इस तरह मुझे लगता है कि इस सवाल का सही जवाब है। –

+0

पूछताछकर्ता ने इसे स्वीकार कर लिया होगा .. उत्तर के लिए धन्यवाद .. :) – ihsan

9

ध्यान रखें कि गिने मापदंडों के लिए यह केवल काम करता है, और न नाम वाले पैरामीटर।

$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

मैं यह पता लगाने की कोशिश कर रहा था कि मुझे काम करने के लिए सरणी पैरामीटर क्यों नहीं मिल रहे थे - नामित पैरामीटर को मेरे दिन सहेजे गए नंबर :-) –

+1

मैं बस इस सवाल पर आया और वैसे भी नामित पैरामीटर के साथ कोशिश की। ऐसा लगता है कि इस उत्तर के बीच कहीं और ऐसा लगता है, इस नाम को नामित पैरामीटर के लिए भी अनुमति देने के लिए सिद्धांत बदल दिया गया था। –

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

} 
संबंधित मुद्दे