2011-11-22 14 views
29

से लौटे हो जाओ मैं अपने Symfony2 भंडार कक्षा में निम्न कोड ...Symfony2 और सिद्धांत - पंक्तियों की संख्या डेटा स्रोत

$query = $this->createQueryBuilder('foo') 
     ->where('foo.bar = :id') 
     ->setParameter('id', $myID) 
     ->getQuery(); 

मैं कैसे पंक्तियों की संख्या डेटाबेस द्वारा पाया मिलता है है?

अग्रिम धन्यवाद

उत्तर

38

आप DQL निष्पादित करने के लिए कुछ आप चाहते हैं की जरूरत है।

$query = $this->createQueryBuilder() 
       ->from('foo', 'f') 
       ->where('foo.bar = :id') 
       ->setParameter('id', $myID) 
       ->getQuery(); 


$total = $query->select('COUNT(f)') 
       ->getQuery() 
       ->getSingleScalarResult(); 
+5

पर काम करते समय मैं इसे अनुकूलित करने के वैकल्पिक तरीके की तलाश कर रहा हूं यह खराब समाधान है + यह नए सिम्फनी 2 में काम नहीं करता है - इसके बजाय नीचे दिए गए उत्तर का उपयोग करें। – thorinkor

18

में आप निष्पादित क्वेरी तो परिणाम प्राप्त। आप परिणाम है, तो आप परिणामों पर एक count करके रिकॉर्ड की संख्या प्राप्त:

$results = $query->getResult(); 
$resultCount = count($results); 

आप 25 रिकॉर्ड की कुल से बाहर हो रही की तरह, पेजिंग के कारण चिंतित हैं। फिर, आपके पास दो विकल्प हैं।

  • आप क्वेरी दो बार, एक और समय केवल 25 परिणाम विधि setFirstResult और setMaxResults का उपयोग कर पुनः प्राप्त करने के कुल परिणाम पाने के लिए एक बार प्रदर्शन करते हैं। यह विधि setFirstResult आपको ऑफसेट और दूसरा, setMaxResults, रिकॉर्ड्स की संख्या सेट करने में सक्षम बनाती है। निम्नलिखित कोड आपको 25 से 50 तक के परिणाम देगा, यदि आप पेज द्वारा 25 रिकॉर्ड का उपयोग करते हैं तो यह दूसरा पृष्ठ है।

    $query->setFirstResult(25);
    $query->setMaxResults(25);

  • आप देख सकते हैं जो paginator समर्थन Doctrine2 के लिए सिद्धांत-एक्सटेंशन। ये एक्सटेंशन Doctrine2 के डेवलपर में से एक द्वारा किए गए हैं। आप इन here की समीक्षा कर सकते हैं।

इस सहायता की आशा करें।

सादर,
मैट

+2

@Reuven जवाब क्योंकि यह डेटाबेस प्रबंधक के आंतरिक 'COUNT' समारोह उपयोग करता है, थोड़ा बेहतर गिनती भाग के लिए, है। यह बेहतर है क्योंकि परिणाम गिनती के लिए स्थानांतरित नहीं किए जाते हैं। मेरी अन्य टिप्पणियां अभी भी लागू होती हैं। – Matt

+0

धन्यवाद। मुझे लगता है कि मेरा जवाब केवल तभी बेहतर होगा जब आपको केवल गिनती की आवश्यकता हो, न कि ऑब्जेक्ट्स। – Reuven

+0

आपका मतलब है सेट फर्स्ट रिसेट – jeremymarc

29

मुझे लगता है कि आप ऐसा ही कुछ कर सकते हैं:

$query = $this->createQueryBuilder() 
    ->select('COUNT(f.id)') 
    ->from('foo', 'f') 
    ->where('foo.bar = :id') 
    ->setParameter('id', $myID) 
    ->getQuery(); 

$total = $query->getSingleScalarResult(); 
+0

यह एक अच्छा जवाब है क्योंकि मुझे लगता है कि इसे केवल एक डेटाबेस क्वेरी की आवश्यकता है। – Acyra

6

मुझे लगता है कि के रूप में यह हो जाता है इस के रूप में संक्षिप्त है:

$qb = $repo->createQueryBuilder('entity'); 
$qb->select('COUNT(entity)'); 

$count = $qb->getQuery()->getSingleScalarResult(); 

कहाँ $repo प्रकार का है Doctrine\ORM\EntityRepository

-1

PHP count() फ़ंक्शन का उपयोग क्यों न करें?

जैसा कि सिद्धांत आपके सभी परिणामों वाले एक सरणी को वापस कर देता है, आप आसानी से आपके अनुरोध द्वारा लौटाई गई पंक्तियों की संख्या प्राप्त कर सकते हैं।

कि रूप में सरल रूप:

[...] // Your doctrine query 
$foo = $query->getResult(); 
$nbRow = count($foo); 

कहाँ $query चर आप अपने सिद्धांत क्वेरी बनाने के लिए उपयोग है।php प्रलेखन के लिए

लिंक: http://php.net/manual/en/function.count.php

+2

यदि आपको केवल गिनती की आवश्यकता है तो आपको कभी भी डेटा लोड नहीं करना चाहिए। बेहतर डीबी आपके लिए गिनती को संभालने दें। यदि परिणाम सेट भारी है तो आपका प्रदर्शन बुरी तरह से पीड़ित होगा, जबकि आपको केवल एक पूर्णांक परिणाम था। – Koen

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