आप एक इकाई फ़ील्ड के लिए एकल स्तंभ परिणाम - मूल क्वेरी देखें। ए> और परिणामसेटमैपिंग इसे पाने के लिये। एक साधारण उदाहरण के रूप में:
use Doctrine\ORM\Query\ResultSetMapping;
$sql = '
SELECT p.*, COUNT(r.id)
FROM products p
LEFT JOIN reviews r ON p.id = r.product_id
';
$rsm = new ResultSetMapping;
$rsm->addEntityResult('AppBundle\Entity\Product', 'p');
$rsm->addFieldResult('p', 'COUNT(id)', 'reviewsCount');
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$results = $query->getResult();
फिर आपकी उत्पाद इकाई में आपके पास एक $reviewsCount
. होगा फ़ील्ड और गिनती उस पर मैप की जाएगी। ध्यान दें कि यह तभी काम करेगा जब आपके पास डॉक्ट्रिन मेटाडेटा में परिभाषित कॉलम होगा, जैसे:
/**
* @ORM\Column(type="integer")
*/
private $reviewsCount;
public function getReviewsCount()
{
return $this->reviewsCount;
}
यह द्वारा सुझाया गया है। कुल फ़ील्ड
सिद्धांत दस्तावेज। समस्या यह है कि आप अनिवार्य रूप से डॉक्ट्रिन को यह सोचने पर मजबूर कर रहे हैं कि आपके डेटाबेस में reviews_count
नामक एक और कॉलम है। , जो आप नहीं चाहते हैं। तो, यह अभी भी उस कॉलम को भौतिक रूप से जोड़े बिना काम करेगा, लेकिन यदि आप कभी भी doctrine:schema:update
चलाते हैं यह आपके लिए उस कॉलम को जोड़ने जा रहा है। दुर्भाग्य से सिद्धांत वास्तव में आभासी गुणों की अनुमति नहीं देता है, इसलिए एक अन्य समाधान यह होगा कि आप अपना स्वयं का कस्टम हाइड्रेटर लिखें, या शायद loadClassMetadata
की सदस्यता लें। ईवेंट और मैन्युअल रूप से अपने विशेष निकाय (या निकाय) लोड होने के बाद स्वयं मैपिंग जोड़ें।
ध्यान दें कि अगर आप कुछ ऐसा करते हैं जैसे COUNT(r.id) AS reviewsCount
तो अब आप COUNT(id)
. का उपयोग नहीं कर सकते आपके addFieldResult()
. में फ़ंक्शन, और इसके बजाय उपनाम reviewsCount
. का उपयोग करना चाहिए उस दूसरे पैरामीटर के लिए।
आप का भी उपयोग कर सकते हैं ResultSetMappingBuilder
परिणाम सेट मैपिंग का उपयोग करने की शुरुआत के रूप में।
मेरा वास्तविक सुझाव यह है कि सभी अतिरिक्त सामानों से गुजरने के बजाय इसे मैन्युअल रूप से करें। अनिवार्य रूप से एक सामान्य क्वेरी बनाएं जो आपकी इकाई और स्केलर दोनों परिणामों को एक सरणी में लौटाए, फिर स्केलर परिणाम को अपनी इकाई पर संबंधित, अनमैप्ड फ़ील्ड पर सेट करें, और इकाई को वापस कर दें।