Как переопределить действие preupdate, чтобы не изменить мое поле `nuped_at` в доктрине?
Вопрос
Я хочу отключить автоматическое поведение изменения поля «updated_at» при обновлении объекта. Я хочу сделать это вручную; Или, по крайней мере, имейте возможность отключить его, как хотелось.
Я знаю, что могу сделать это, построив свое собственное поведение, как в этот замечательный ответ. Анкет Но я искал что -то «чище», изменяя слушателя объекта.
- Я попытался переопределить действие 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
Есть еще идеи или код, чтобы посмотреть?
Благодарность!
Решение
Согласно документам в http://www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors#timestampable Если вы хотите использовать временные метки, но не обновленная часть, просто используйте:
Timestampable:
updated:
disabled: true
И добавьте в свое собственное поле updated_at в разделе столбцов.
Другие советы
Вы можете получить доступ к слушателю напрямую из вашего объекта, как это:
$listenerChain = $this->getListener();
$i = 0;
while ($listener = $listenerChain->get($i))
{
if ($listener instanceof Doctrine_Template_Listener_Timestampable)
{
$listener->setOption('disabled', true);
break;
}
$i++;
}
Самый простой способ сделать это - переименовать updated_at
поле к чему -то другому. Так что это игнорируется доктриной.
Таким образом, вы можете точно контролировать содержимое поля.
// 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);