2011-10-31 20 views
21

मैं किसी इकाई के मौजूदा संस्करण को पुनर्प्राप्त करने में सक्षम होना चाहता हूं ताकि मैं इसे नवीनतम संस्करण से तुलना कर सकूं। जैसे एक फाइल को संपादित करना, मैं जानना चाहता हूं कि डीबी में होने के बाद मूल्य बदल गया है या नहीं।सिम्फनी 2 में परिणाम कैशिंग से डॉक्टर 2 को कैसे रोकें?

$entityManager = $this->get('doctrine')->getEntityManager(); 
    $postManager = $this->get('synth_knowledge_share.manager'); 

    $repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); 
    $post = $repository->findOneById(1); 

    var_dump($post->getTitle()); // This would output "My Title" 
    $post->setTitle("Unpersisted new title"); 

    $existingPost = $repository->findOneById(1); // Retrieve the old entity 

    var_dump($existingPost->getTitle()); // This would output "Unpersisted new title" instead of the expected "My Title" 

क्या कोई जानता है कि मैं इस कैशिंग के आसपास कैसे जा सकता हूं?

उत्तर

40

यह एक सामान्य व्यवहार है। यह एक और पूछताछ के बिना आईडी है द्वारा

सिद्धांत भंडार EntityManager में लिया गया संस्थाओं के लिए एक संदर्भ है, तो यह एक इकाई लौट सकते हैं।

आप की तरह कुछ कर सकते हैं: - यदि आप इसे फिर से बनाए रखना चाहते> मर्ज() विधि

$entityManager = $this->get('doctrine')->getEntityManager(); 
$repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); 
$post = $repository->find(1); 

$entityManager->detach($post); 

// as the previously loaded post was detached, it loads a new one 
$existingPost = $repository->find(1); 

लेकिन उस बारे में पता होना के रूप में $ पद इकाई अलग था, आप का उपयोग करना चाहिए।

+4

स्वादिष्ट, 'अलग' एकदम सही है। –

+10

इसके लिए धन्यवाद। त्वरित युक्ति - यदि आपको सभी इकाइयों को अलग करने की आवश्यकता है (उदाहरण के लिए गैर-इन्सुलेटेड परीक्षणों में), तो आप '$ इकाई प्रबंधक-> साफ़()' का उपयोग कर सकते हैं। – richsage

+0

दूसरी बात यह देखने के लिए है कि क्या आपके पास लेनदेन खुला है या नहीं। यदि आपने '$ इकाई प्रबंधक-> प्रारंभ ट्रांज़ेक्शन() 'किया है, तो सुनिश्चित करें कि आप इकाई प्रबंधक को साफ़ करने का प्रयास करने से पहले लेनदेन बंद करें (उदा।' इकाई इकाई प्रबंधक-> रोलबैक() ')। एक खुला लेनदेन एक संगत, इसलिए अद्यतन नहीं किया जाएगा, डेटाबेस के दृश्य। – stanhope

8

आप refresh विधि का भी उपयोग कर सकते हैं, जो किसी भी स्थानीय परिवर्तन को ओवरराइड करते हुए डेटाबेस से किसी भी इकाई की लगातार स्थिति को रीफ्रेश करता है, जो अभी तक जारी नहीं हुआ है। कुछ की तरह:

$entityManager = $this->get('doctrine')->getEntityManager(); 
$repository = $entityManager->getRepository('KnowledgeShareBundle:Post'); 
$post = $repository->find(1); 

$entityManager->refresh($post); 

अब $ पद डेटाबेस से पिछले संस्करण में शामिल है।

+1

आप महोदय एक जीवन बचतकर्ता हैं! –

+0

यह वास्तव में उपयोगी है और कम ज्ञात प्रतीत होता है। इसके लिए अच्छी तरह से काम करने के लिए संबंधित इकाइयों पर कैस्केड = "रिफ्रेश" होने की सूचना है – DevDonkey