2010-01-13 13 views
15

मैं कैसे जांचूं कि फ़ील्ड बदल गया है या नहीं?सिद्धांत श्रोता - केवल एक कार्य बदल गया है यदि कोई फ़ील्ड बदल गया है

मैं केवल preSave() में कोई कार्रवाई ट्रिगर करना चाहता हूं, यदि विशिष्ट फ़ील्ड बदल गया हो, e.q.

public function preSave() { 
    if ($bodyBefore != $bodyNow) { 
     $this->html = $this->_htmlify($bodyNow); 
    } 
} 

सवाल यह है कि प्राप्त करने के लिए इस $bodyBefore और $bodyNow

उत्तर

23

कृपया डेटाबेस को दोबारा नहीं लाएं! यह सिद्धांत 1.2 के लिए काम करता है, मैंने निम्न संस्करणों का परीक्षण नहीं किया है। भी बाहर documentation

// in your model class 
public function preSave($event) { 
    if (!$this->isModified()) 
    return; 

    $modifiedFields = $this->getModified(); 
    if (array_key_exists('title', $modifiedFields)) { 
    // your code 
    } 
} 

चेक,।

-1

इस आजमाएँ है।

public function preSave($event) 
{ 
    $id = $event->getInvoker()->id; 
    $currentRecord = $this->getTable()->find($id); 

    if ($currentRecord->body != $event->getInvoker()->body) 
    { 
     $event->getEnvoker()->body = $this->_htmlify($event->getEnvoker()->body); 
    } 
} 
+0

जब मैं 'preSave() 'में' $ event' पैरामीटर जोड़ता हूं 'विधि को निष्पादित नहीं किया जाता है। – takeshin

+0

आप किस सिद्धांत का उपयोग कर रहे हैं? – Travis

+0

मैं सिद्धांत 1.2.1 का उपयोग करता हूं – takeshin

3

ट्रैविस का जवाब लगभग सही था, क्योंकि समस्या यह है कि जब आप सिद्धांत क्वेरी करते हैं तो ऑब्जेक्ट ओवरराइट हो जाता है। तो समाधान है:

public function preSave($event) 
{ 
    // Change the attribute to not overwrite the object 
    $oDoctrineManager = Doctrine_Manager::getInstance(); 
    $oDoctrineManager->setAttribute(Doctrine::ATTR_HYDRATE_OVERWRITE, false); 

    $newRecord = $event->getInvoker(); 
    $oldRecord = $this->getTable()->find($id); 

    if ($oldRecord['title'] != $newRecord->title) 
    { 
    ... 
    } 
} 
संबंधित मुद्दे