Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या सिद्धांत में किसी फ़ील्ड के रूप में SQL फ़ंक्शन के परिणाम का उपयोग करना संभव है?

आप एक इकाई फ़ील्ड के लिए एकल स्तंभ परिणाम - मूल क्वेरी देखें। ए> और परिणामसेटमैपिंग इसे पाने के लिये। एक साधारण उदाहरण के रूप में:

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 परिणाम सेट मैपिंग का उपयोग करने की शुरुआत के रूप में।

मेरा वास्तविक सुझाव यह है कि सभी अतिरिक्त सामानों से गुजरने के बजाय इसे मैन्युअल रूप से करें। अनिवार्य रूप से एक सामान्य क्वेरी बनाएं जो आपकी इकाई और स्केलर दोनों परिणामों को एक सरणी में लौटाए, फिर स्केलर परिणाम को अपनी इकाई पर संबंधित, अनमैप्ड फ़ील्ड पर सेट करें, और इकाई को वापस कर दें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक ही मशीन पर चल रहे कई MySQL इंस्टेंस की निगरानी कैसे करें - ClusterControl टिप्स और ट्रिक्स

  2. यूएस दिनांक स्वरूप को ANSI SQL दिनांक स्वरूप में बदलें (YYYY-mm-dd)

  3. MYSQL तालिका में नया कॉलम कैसे जोड़ें?

  4. mysql में एक कॉलम का नाम बदलने में इतना समय क्यों लगता है?

  5. वर्डप्रेस ने IN() कंडीशन के साथ स्टेटमेंट तैयार किया