2010-02-18 55 views
1

我想禁用更新對象時更改'updated_at'字段的自動行爲。我想手動完成它;或者至少可以根據需要禁用它。如何覆蓋preUpdate操作,不修改Doctrine中的`updated_at`字段?

我知道我可以通過建立自己的行爲來做到這一點,如this great answer。但我正在尋找一種「更乾淨」的方式來修改對象的偵聽器。

  • 我試着重寫模型上的preUpdate()動作。
  • 我試圖禁用的聽衆,並沒有什麼:

-

Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', true); 
// or 
Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', array('preUpdate')); 
// As reference, I've used these two lines on a Symfony Task 

任何更多的想法,或代碼來看待?

謝謝!

回答

3

Timestampable: 
    updated: 
    disabled: true 

而且在列部分添加在自己的updated_at領域。

+0

我喜歡它,我甚至不需要做任何遷移:-) – fesja 2010-02-23 17:32:22

0
// get the first (in our case the timstampable) listener for the record 
$timestampable = $record->getListener()->get(0); 

// disable setting of created_at at the timestampable listener 
$timestampable->setOption(array('created' => array('disabled' => true))); 

問題是,你必須知道聽衆的位置

你也可以禁用所有聽衆這樣說:

$record->getListener()->setOption('disabled',true); 
4

你可以從你的對象直接訪問聽者這樣:


    $listenerChain = $this->getListener(); 

    $i = 0; 

    while ($listener = $listenerChain->get($i)) 
    { 
    if ($listener instanceof Doctrine_Template_Listener_Timestampable) 
    { 
     $listener->setOption('disabled', true); 
     break; 
    } 
    $i++; 
    }  
+0

取決於用例,這個答案可能更加相關。原來的問題是關於「有可能將其禁用爲想要的」。 – Bonswouar 2015-09-16 15:01:15