我剛剛遇到類似情況後發現了這個問題。 @彼得的回答幾乎是我在尋找的,但我已經添加了一些變化。
/**
* 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記錄
這將阻止它被插入,而是跳過操作我喜歡它來更新字段。 – RoboTamer 2010-04-01 23:32:28