2010-02-18 1 views
1

Я хочу отключить автоматическое поведение изменения поля «updated_at» при обновлении объекта. Я хочу сделать это вручную; или, по крайней мере, иметь возможность отключить его по мере необходимости.Как переопределить действие preUpdate, чтобы не изменять поле `updated_at` в Doctrine?

Я знаю, что могу сделать это, построив свое поведение, как в 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

согласно документации на http://www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors#timestampable, если вы хотите использовать Timestampable но не обновленный его часть просто использовать:

Timestampable: 
    updated: 
    disabled: true 

И добавить в своем собственном поле updated_at в секции колонны.

+0

Мне это нравится, и мне даже не нужно переносить :-) – fesja

0

Самый простой способ сделать это - переименовать поле updated_at в другое. Так что доктрина игнорируется.

Таким образом, вы можете точно контролировать содержимое поля.

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

Смежные вопросы