2012-01-19 29 views
14

प्रलेखन कहते हैं:मैं प्रीअपडेट ईवेंट श्रोता में फ़ील्ड का मान कैसे बदलूं?

परिवर्तन पारित कर दिया संस्थाओं के क्षेत्रों के लिए अब और फ्लश आपरेशन द्वारा मान्यता प्राप्त नहीं कर रहे हैं, आदिम फ़ील्ड मान को संशोधित करने के गणना परिवर्तन सेट घटना के लिए पारित का उपयोग करें।

लेकिन यह भी कहते हैं:

getEntityChangeSet() changeset सरणी की एक प्रति प्राप्त करने के लिए। इस लौटाए गए सरणी में परिवर्तन अद्यतन को प्रभावित नहीं करते हैं।

क्या इसका मतलब है कि मैं प्री-अपडेट ईवेंट श्रोता में किसी इकाई के फ़ील्ड को नहीं बदल सकता? यदि नहीं, तो मैं इस अद्यतन को पूरा करने के बारे में कैसे जाउंगा?

$em = $args->getEntityManager(); 
$uow = $em->getUnitOfWork(); 
$meta = $em->getClassMetadata(get_class($entity)); 
$uow->recomputeSingleEntityChangeSet($meta, $entity); 
+0

कृपया उस दस्तावेज़ को लिंक प्रदान करें – GusDeCooL

उत्तर

33

जाहिर है आप परिवर्तनों को प्रभावी करने के लिए अपने आप को changeset recompute करने की जरूरत है। विदेशी मुद्रा:

public function preUpdate(PreUpdateEventArgs $args) 
{ 
    $entity = $args->getEntity(); 

    if ($entity instanceof Product) 
    { 
     $args->setNewValue(
      "discount", 
      123 
     ); 
    } 
} 
+1

यह काम करता है! धन्यवाद –

+4

यह संबंधित संस्थाओं के लिए काम नहीं करता है, भले ही @ कैस्केड एनोटेशन सेट हो। – Simon

5

वैकल्पिक रूप से आप PreUpdateEventArgs वर्ग (http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.Event.PreUpdateEventArgs.html) का उपयोग कर सकते हैं:

+11

इस विधि के साथ एक समस्या यह है कि यदि आप उस फ़ील्ड पर सेट न्यूवैल्यू करना चाहते हैं जो पहले नहीं बदला गया था। चूंकि फ़ील्ड पहले से ही बदलाव में नहीं था, इसलिए एक त्रुटि फेंक दी गई है। डेविडडब्ल्यू का जवाब इस सीमा के आसपास आता है। –

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