2013-07-12 6 views
25

क्या यह निर्धारित करने का कोई तरीका है कि पैरामीटर एक ऑब्जेक्ट है जो पहले से ही सिद्धांत द्वारा जारी है या नहीं? एक इकाई प्रबंधक विधि की तरह कुछ जो जांच करता है कि कोई वस्तु एक पुरानी पुरानी वस्तु नहीं है लेकिन वास्तव में स्मृति में पहले से ही कुछ है।यह निर्धारित करने के लिए कि कोई सिद्धांत इकाई जारी है या नहीं?

$isPersisted = \Doctrine\ORM\UnitOfWork::STATE_MANAGED === $entityManager->getUnitOfWork()->getEntityState($entity); 

संपादित करें: @Andrew एटकिंसन के कहे अनुसार, ऐसा लगता है EntityManager->contains($entity) अब पसंदीदा तरीका है

<?php 
public function updateStatus(Entity $entity, EntityStatus $entityStatus) 
{ 
    $entityManager = $this->getEntityManager(); 
    try { 
     // checking persisted entity 
     if (!$entityManager->isPersisted($entity)) { 
      throw new InvalidArgumentException('Entity is not persisted'); 
     } 
     // ... 
    } catch (InvalidArgumentException $e) { 
    } 
} 

उत्तर

37

आप इस तरह UnitOfWork एपीआई का उपयोग करने की है।

+16

यूनिटऑफवर्क को @internal चिह्नित किया गया है। इसका आमतौर पर मतलब है कि आपको उपयोग को हटाने या इसे अन्य निर्माण के साथ बदलने की सलाह दी जाती है। 'EntityManager-> का उपयोग करना ($ इकाई)' को प्राथमिकता दी जानी चाहिए –

35

EntityManager विधि contains इस उद्देश्य को पूरा करता है। the documentation (2.4) देखें।

सिद्धांत 2.4 में, कार्यान्वयन इस तरह दिखता है:

class EntityManager { 
// ... 
public function contains($entity) 
{ 
    return $this->unitOfWork->isScheduledForInsert($entity) 
     || $this->unitOfWork->isInIdentityMap($entity) 
     && ! $this->unitOfWork->isScheduledForDelete($entity); 
} 
+0

यह उत्तर है! – Mvorisek

5

एक आसान और अधिक मजबूत तरीका अगर इकाई प्लावित है या नहीं, सिर्फ आईडी के लिए जाँच की जाँच करने।

if (!$entity->getId()) { 

    echo 'new entity'; 

} else { 

    echo 'already persisted entity'; 

} 

यह समाधान बहुत ज्यादा मामले पर निर्भर है, लेकिन यह के लिए सबसे अच्छा हो सकता है आप


संपादित करें:

टिप्पणियों से यह प्रतीत होता है यह सबसे अधिक प्रासंगिक जवाब नहीं है, हालांकि किसी के लिए उपयोगी हो सकता है क्योंकि यह प्रश्न से निकटता से संबंधित है।

+1

क्या जारी वस्तुओं में पहले से आईडी है? मैंने सोचा कि यह केवल – arnaudbey

+0

@arnaudbey के लिए मामला था, मुझे लगता है कि यह मामला है, जो उत्तर को लगभग अप्रासंगिक बनाता है। उत्तर –

+0

संपादित करेगा यह Doctrine के साथ Postgresql डेटाबेस का उपयोग करते समय काम नहीं करेगा: जब इकाई प्रबंधक और आईडी को इकाइयों को बनाए रखने के लिए इकाई को जिम्मेदार ठहराया जाता है। इस मामले में (postgresql का उपयोग), आप जांच सकते हैं कि एक इकाई जारी है, भले ही यह आपके उत्तर में उल्लिखित ** फ्लश ** नहीं है ... डीबी के उपयोग के बीच अंतर से बचने के लिए, एपीआई का उपयोग किया जाना चाहिए । –

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

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