2012-07-13 7 views
5

मैं एक बंडल एक परीक्षण वस्तु जो testQuestion के एक नंबर वस्तुओं, जिनमें से प्रत्येक एक सवाल और जवाब दिया (या 0 कोई जवाब नहीं है, तो है रखती है की स्थापना की है के भीतर संबंधित वस्तुओं की गिनती स्टोर करने के लिए)। टहनी से मैं परीक्षण वस्तु से जानकारी प्राप्त करने में सक्षम होना चाहता हूं कि यह कहने के लिए कि कितने प्रश्न हैं और कितने उत्तर दिए गए हैं।Symfony2/सिद्धांत कैसे एक इकाई

मैं db के बाहर इस खींचने के लिए एक प्रश्न बनाया है, और टेस्ट इकाई में 2 नए गुणों बनाया है प्रश्नों की संख्या स्टोर करने के लिए और संख्या जवाब दे दिया। मैंने एक टेस्ट रिपोजिटरी बनाई है जिसमें क्वेरी रहती है। टेस्ट ऑब्जेक्ट यह देखने के लिए जांच करता है कि क्या ऑब्जेक्ट का मान सेट है और यदि आवश्यक हो तो इसे लोड नहीं किया जाता है क्योंकि मुझे हमेशा इस जानकारी की आवश्यकता नहीं होगी।

हालांकि मैं कैसे परीक्षण वस्तु को भंडार कोड से जोड़ने के लिए पर अटक कर रहा हूँ, दोनों रेपो समारोह कॉल करने के लिए और रेपो समारोह के लिए प्रासंगिक टेस्ट ऑब्जेक्ट के लिए मूल्यों को बचाने के लिए।

एक्मे/Quizbundle/टेस्ट/test.php

namespace Acme\QuizBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Acme\QuizBundle\Entity\TestRepository; 

/** 
* @ORM\Entity(repositoryClass="Acme\QuizBundle\Entity\TestRepository") 
* @ORM\Table(name="test") 
*/ 
class Test { 
protected $numQuestions = null; 
protected $numQuestionsAnswered = null; 

public function getNumQuestionsAnswered() { 
    if (is_null($this->numQuestionsAnswered)) { 
     $repository = $this->getEntityManager()->getRepository('\AcmeQuizBundle\Test'); 
     $values = $repository->calculateNumQuestions(); 
    } 
    return $this->numQuestionsAnswered; 
} 

एक्मे/Quizbundle/टेस्ट/TestRepository.php

namespace Acme\QuizBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

class TestRepository extends EntityRepository { 

private function calculateNumQuestions() { 

    $qb = $this->getEntityManager() 
       ->createQueryBuilder(); 

    $query = $this->getEntityManager()->createQueryBuilder() 
         ->select('COUNT(id)') 
      ->from('testquestion', 'tq') 
      ->where('tq.test_id = :id') 
      ->setParameter('id', $this->getId()) 
      ->getQuery(); 

    $result = $query->getSingleScalarResult(); 
    var_dump($result); 
    } 

उत्तर

12

एक संख्या हैं (getNumQuestions() के लिए एक मिलान विधि नहीं है) इस परिणाम को प्राप्त करने के लिए आप विभिन्न पैटर्न का उपयोग कर सकते हैं, जिनमें से सबसे सरल केवल aggregate field का उपयोग करना है। यह प्रत्येक बार इसकी आवश्यकता होने पर इसकी गणना करने के बजाए संशोधित होने के बाद जानकारी संग्रहीत करता है। तुम भी सिद्धांत बता सकते हैं -

एक वैकल्पिक समाधान (यह मानते हुए पहले से ही एक नहीं है कि), तो आपके टहनी टेम्पलेट में आप बस {{ testEntity.questionsAnswered.count() }} उपयोग कर सकते हैं अपने टेस्ट और TestQuestion खजाने के बीच एक-से-अनेक संघ बनाने के लिए है इतना है कि यह COUNT SQL विवरण का उपयोग करता है कि कितने प्रश्नों का उत्तर दिया देखते हैं (डिफ़ॉल्ट रूप से यह वास्तव में सवाल संस्थाओं को हासिल करेगा जब आप संघ की गणना करने की कोशिश) को देखने के लिए यह एक "extra-lazy" association बनाने के लिए।

अंत में, विधि है कि मैं अत्यधिक की सिफारिश नहीं होगा, लेकिन अपनी स्थिति पर निर्भर करता है की आवश्यकता हो सकती है। आपके प्रश्न में आपके द्वारा उपयोग किए जाने वाले दृष्टिकोण के समान, आप अपने भंडार में प्रश्न गणना प्राप्त करते हैं, लेकिन सिम्फनी के सरल मॉडल दृष्टिकोण के साथ रखने के लिए, आप इकाई के अंदर से क्वेरी को नहीं निकालते हैं (क्योंकि इकाई के बारे में कभी जानकारी नहीं होनी चाहिए इकाई प्रबंधक/भंडार)।

इसके बजाय, जब भी आपकी टेस्ट इकाई का एक उदाहरण लोड हो जाता है, तो आप सूचित होने के लिए एक डॉक्टर इवेंट लिस्टनर का उपयोग कर सकते हैं (पोस्टलोड ईवेंट का उपयोग करके here देखें), फिर अपनी रिपोजिटरी विधि को कॉल करें और इसे वहां से इकाई पर सेट करें।

+0

धन्यवाद, यह वास्तव में उपयोगी है –

+0

सावधान रहें !! 1 अतिरिक्त आलसी संगठनों के साथ आपको अंतर्निहित ट्विग ** 'lenght' के बजाय 'संग्रह # गिनती()' कॉल ** का उपयोग करना होगा। ** सही तरीका है कि एसक्यूएल COUNT का उपयोग करेगा: ** '{{testEntity.questionsAnswered.count}}' ('| length' स्मृति में पंक्तियों को लाते समय का कारण होगा!) –

+0

सुधार @Sanya_Zol, तदनुसार जवाब अद्यतन के लिए धन्यवाद –