Я только что откопал этот вопрос после столкновения с подобной ситуацией. @ Ответ Питера - почти то, что я искал, но я добавил пару изменений.
/**
* Check if identical record exists before (re)inserting
* @param \Doctrine_Event $event
* @return void
*/
public function preInsert(\Doctrine_Event $event)
{
$existing = $this->getTable()->findOneBy('email', $this->email);
if ($existing) {
$this->assignIdentifier($existing->id);
$this->hydrate($existing->toArray());
$this->state(self::STATE_CLEAN);
$event->skipOperation();
}
}
Использование hydrate()
вместо refresh()
означает, что вы выполняете на 1 запрос SELECT меньше.
Я знаю, что у вас, вероятно, есть ответ на эту проблему (по крайней мере, я надеюсь, что у вас есть), но я решил добавить свое решение для других с тем же вопросом.
Я также удалил if ($this->state() === self::STATE_TDIRTY)
, поскольку preInsert()
применяется только для записей TDIRTY