2011-04-11 7 views
25

मेरे पास एक सिद्धांत क्वेरी है जो ब्लॉग पोस्ट और उनकी टिप्पणियां देता है:एक fetch- जुड़े संग्रह के साथ एक सिद्धांत क्वेरी सीमित?

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c 

मैं परिणाम को 10 ब्लॉग पोस्ट तक सीमित करना चाहता हूं। डीक्यूएल दस्तावेज़ीकरण के मुताबिक, setMaxResults() उन प्रश्नों पर सही ढंग से काम नहीं करता है जो एक संग्रह (इस मामले में टिप्पणियां) में शामिल होते हैं:

यदि आपकी क्वेरी में एक fetch-join संग्रह होता है जो परिणाम सीमा निर्दिष्ट करता है विधियां हैं काम नहीं कर रहे हैं क्योंकि आप उम्मीद करेंगे। मैक्स परिणाम सेट करें डेटाबेस परिणाम पंक्तियों संख्या को प्रतिबंधित करता है, हालांकि fetch-join संग्रह के मामले में एक रूट इकाई कई पंक्तियों में दिखाई दे सकती है, प्रभावी परिणामों की निर्दिष्ट संख्या से कम हाइड्रेटिंग।

मैं एक ऐसे क्वेरी क्वेरी को सही तरीके से कैसे सीमित करूं जिसमें एक fetch-join संग्रह शामिल है (इस मामले में, परिणामों को 10 ब्लॉग पोस्ट तक सीमित करें)?

उत्तर

25

पेजिनेट को सिद्धांत 2.2 के साथ विलय कर दिया गया था और नया सिम्फनी 2 रिलीज 2.0.10 संगत है।

अब यह है कि

//use Doctrine paginator 
use Doctrine\ORM\Tools\Pagination\Paginator; 

तरह का उपयोग आपकी क्वेरी लिखें तो ऐसे ही परिणाम कहते हैं।

$query->setMaxResults($limit); 
$query->setFirstResult($offset); 
$results = new Paginator($query, $fetchJoin = true); 

आशा है कि यह आपकी मदद करेगा।

नोट: यदि आप एसएफ 2 2.0.10 का उपयोग कर रहे हैं, तो आपको डीपीएस और deps.lock फ़ाइलों को अद्यतन करना चाहिए और सिद्धांत बंडलों के लिए 2.2 संस्करण निर्दिष्ट करना चाहिए।

-1

एक क्वेरीबिल्डर के साथ ऐसा ही था और यह काम करता है। शायद कुछ और समस्या है?

$qb->add('select', 'b, c, ch, g') 
    ->add('from', 'Broadcast b') 
    ->add('groupBy', 'b.title') 
    ->add('where', 'b.imageBig != \'\'') 
    ->add('orderBy', 'b.starttime ASC') 
    ->setMaxResults(10) 
    ->leftJoin('b.category', 'c') 
    ->leftJoin('b.channel', 'ch') 
    ->leftJoin('b.genre', 'g') 
+0

धन्यवाद, मैं इसे क्वेरी बिल्डर के साथ आज़माउंगा। शायद यह सिर्फ डीक्यूएल का उपयोग करने के साथ एक मुद्दा है। –

+2

यह संग्रह में शामिल होने के लिए काम नहीं करेगा। ईसाई केवल टू-वन संघों में शामिल हो गया है। – beberlei

3

यह भंडार http://github.com/beberlei/DoctrineExtensions एक paginator विस्तार से काम करता है कि लाने के साथ जुड़ जाता है। आपको अनिवार्य रूप से 3 चयन विवरण बनाना होगा, जिनमें से सभी यह एक्सटेंशन आपके लिए करता है।

+0

धन्यवाद। क्या आप यह समझते हैं कि सिद्धांत के बिना इसे कैसे किया जाए?अभी, मैं किसी भी अतिरिक्त पुस्तकालय को शामिल नहीं करना चाहता हूं जिसकी बिल्कुल आवश्यकता नहीं है। मुझे यह भी लगता है कि इससे भविष्य में कई अन्य पाठकों को फायदा होगा। –

+0

आपको एक्सटेंशन के कोड को देखना चाहिए। इसकी: पहला: एक चयन डिस्टिंट मुख्यता। जहां सभी आईडी प्राप्त करने के लिए खंड। दूसरा: पहले से प्राप्त आईडी के साथ जहां आईडी आईडी (..) के साथ एक चयन खंड। तीसरा: कुल परिणामों की संख्या के लिए एक चयन DISTINCT खंड। – beberlei

+0

धन्यवाद, मैं समझता हूं कि अब क्या हो रहा है। हालांकि मैं एक्सटेंशन का उपयोग कर समाप्त हो गया। थोड़ा ओवरहेड के साथ बहुत उपयोगी एक्सटेंशन की तरह लग रहा था। –

-1

भले ही यह एक पुराना है, Google पर यह स्कोर उच्चतम सिद्धांत की तलाश में शामिल है। जल्दी ही मुझे "सिद्धांत पगिनेटर" की तलाश हुई और Google से आग्रह करने के बाद कि मैं जो खोज रहा था (सिद्धांत सिद्धांत नहीं) मुझे अभी भी इसका उपयोग करने के बारे में कुछ परेशानी थी।

शायद गलत खोजा गया लेकिन वास्तव में पेजिनेटर ऑब्जेक्ट पर अच्छा दस्तावेज़ नहीं मिल सका। वैसे भी, परिणाम प्राप्त करने के लिए मैंने इटरेटर प्राप्त किया और यह ठीक काम किया।

मेरे कोड में ऐसे स्रोत हैं जिनमें आरएसएस लिंक और आलेख हैं जो आरएसएस फ़ीड से आलेख हैं। तो इस उदाहरण में मुझे एक स्रोत और उसके सभी लेख मिलेंगे। यह कोड सिम्फनी से है।

 // get the articles (latest first) from source 743 
     $q=$this->getDoctrine()->getManager() 
      ->createQuery('select s, a from MyCompanyRssBundle:Source s 
      join s.Articles a 
      where s.id = :id 
      order by a.id desc') 
      ->setParameter('id',743); 
     $q->setMaxResults(1); // this limits Articles to be only 1 
           // when using $q->getResult(); 
     $sources=new Paginator($q, $fetchJoin = true); 
     $sources=$sources->getIterator(); 
     var_dump($sources[0]->getArticles()); 
+1

@adridev स्रोतों को पेजिनेटर पर सेट किया गया है और फिर बनाए गए पेजिनेटर द्वारा छोड़ा गया है-> getIterator (दूसरी बार स्रोत ओवरराइड किया गया है)। आपके इनपुट के लिए धन्यवाद हालांकि अगर आपको यह बेहतर बनाने के बारे में कोई सुझाव है तो कृपया इस उत्तर को संपादित करने में संकोच न करें। मैंने थोड़ी देर में सिद्धांत का उपयोग नहीं किया है, इसलिए मुझे यह भी यकीन नहीं है कि यह जवाब क्या था। – HMR

+0

क्षमा करें, मुझे टिप्पणी नहीं मिली। मेरी गलती। – adridev