2012-01-21 20 views
16

यह एक प्राथमिक अनुरोध की तरह प्रतीत हो सकता है, लेकिन मुझे इसे काम करने के लिए प्रतीत नहीं होता है, इसलिए मुझे या तो बेवकूफ कुछ याद आ रहा है, या यह समझ में नहीं आता कि यह कैसे किया जाना चाहिए। अग्रिम में धन्यवाद।सिद्धांत 2.1 डीक्यूएल - कई से कई क्वेरी एकाधिक मान - एकाधिक श्रेणियों में आइटम?

मेरे पास दो से अधिक संबंधों के साथ दो सिद्धांत संस्थाएं हैं: आइटम और श्रेणियां। जो item_has_categories द्वारा शामिल होते हैं।

/** 
* Item 
* 
* @Table(name="items") 
* @Entity(repositoryClass="Entity\Repository\Item") 
*/ 
class Item 
{ 

.... 

/** 
* @var Categories 
* 
* @ManyToMany(targetEntity="Categorie", inversedBy="items", cascade={"persist"}) 
* @JoinTable(name="items_has_categories", 
* joinColumns={ 
*  @JoinColumn(name="items_id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @JoinColumn(name="categories_id", referencedColumnName="id") 
* } 
*) 
*/ 
private $categories; 

.... 
} 

/** 
* Categorie 
* 
* @Table(name="categories") 
* @Entity(repositoryClass="Entity\Repository\Categorie") 
*/ 
class Categorie 
{ 
..... 

/** 
* @var Items 
* 
* @ManyToMany(targetEntity="Item", mappedBy="categories") 
*/ 
private $items; 

.... 
} 

और मैं क्या करने की कोशिश कर रहा हूँ सभी आइटम है कि सभी की श्रेणियों में से "x" संख्या में हैं वापस जाने के लिए एक प्रश्न चलाया जाता है - जो मुझे लगता है/सोचा एक चयन के साथ और और खंड होना चाहिए:

class Item extends EntityRepository 
{ 
    public function findItemsByCategories($categories) 
    { 

    $qString = 'SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE'; 

    $i = 0; 
    foreach ($categories as $c) 
    { 
     $qString .= ' c.name = ?' . $i; 

     if ($i < (count($categories)-1)) 
     { 
      $qString .= ' AND'; 
     } 
     $i++; 
    } 

    $query = $this->_em->createQuery($qString); 
    $query->setParameters($categories); 

    return $query->getResult(); 
} 

कोड का छोटा सा कोई त्रुटि नहीं है और निम्नलिखित DQL चयन करें क्वेरी (जब 2 श्रेणियों सरणी में भेजा जाता है: $ श्रेणियों): बाहर थूक कि

SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE c.name = ?0 AND c.name = ?1 

यह हमेशा एक खाली सरणी लौटा रहा है , यानी, कोई परिणाम नहीं रों। हालांकि मेरे डीबी में, मानदंडों को फिट करने के 20 से अधिक आइटम हैं: दोनों श्रेणियों में हैं।

कोई भी देखता है कि मैं यहां क्या कर रहा हूं? क्या यह एक और चयन होना चाहिए ...? असल में मैं सिर्फ यह जानना चाहता हूं कि डॉक्टर 2+ में कई से अधिक रिश्तों को कैसे पूछना है, जहां एक से अधिक मान हैं जिन्हें पूरा किया जाना चाहिए ...

उत्तर

40

किसी भी दिलचस्पी के लिए, मैंने इसे समझ लिया (दर्दनाक रूप से)। सिद्धांत को वास्तव में डीक्यूएल पेज पर एक पंक्ति के बजाय बेहतर तरीके से समझा जाना चाहिए ....

असल में यह एक और क्वेरी नहीं है, यह सदस्य और प्रश्न है।

SELECT j, t FROM Entity\Item j LEFT JOIN j.itemImages t WHERE ?0 MEMBER OF j.categories AND ?1 MEMBER OF j.categories AND ?2 MEMBER OF j.categories, etc. 

कि सभी वस्तुओं है कि अनुरोध सभी श्रेणियों में हैं वापस आ जाएगी: प्रत्येक श्रेणी के और बनाया जाना चाहिए तो एक सदस्य एक और के साथ पूरे प्रश्न में जोड़ा है।

+1

अपना पता साझा करने के लिए धन्यवाद। मैं एक बहुत ही समान मुद्दे पर छोड़ने वाला था, लेकिन सदस्य ने चाल की थी। आप के लिए सबसे अच्छा –

+1

अंत में ऐसा करने का एक अच्छा तरीका है। वास्तव में सदस्य अधिक दस्तावेज होना चाहिए। यह भी पता नहीं था कि यह अस्तित्व में था। बहुत बहुत धन्यवाद। – ZolaKt

+1

मेरे प्रयोगों से, यह विधि एकाधिक उप-प्रश्नों को चलाने के लिए कारण बन जाएगी। यदि डीक्यूएल इसे स्वीकार करता है, तो आप उप-क्वेरी और WHERE क्लॉज के साथ बहुत बेहतर होंगे जो IN() का उपयोग करता है। अगर मैं अभी भी डीक्यूएल में काम करता हूं तो मैं प्रयोग करूँगा और उत्तर पोस्ट करूंगा। – Lewis