2010-03-30 2 views
3

나는 많은 게시물을 읽었으며 vs 업데이트를 삽입하는 방법에 대한 많은 변형을 발견했지만 나에게 도움이 될만한 것을 찾을 수 없었다.독트린 메서드 업데이트/고유 필드 기반의 삽입

preSave()가 save()에 의해 자동으로 실행되는 경우 preSave가가는 길을 추측합니다.

columns: 
    email: 
    type: string(255) 
    unique: true 
    email: true 

은 내가이 고유로 설정되어 출원 된 경우 (을) 확인 저장할 필요가 그렇다면,이 경우 이메일 주소의 필드 데이터가 고유 있는지 확인합니다. 변경 내용이 게시 된 필드를 삽입하거나 업데이트하기로 결정했습니다.

답변

0

그러나 유효성 검사기를 사용하는 것이 좋습니다.

+0

이것은 삽입되는 것을 막을 것이지만 나는 필드를 업데이트하는 것을 좋아한다. – RoboTamer

0

나는 블라디미르 (Vladimir)의 대답에 맞다. skipOperation 전에 업데이트 로직을 추가하기 만하면된다.

public function preSave($event) 
{ 
    if (!$this->isUniqueEmail()) { 
     // update logic 

     $event->skipOperation(); 
    } 
} 

죄송하지만 블라디미르의 대답에 대해서는 말씀 드릴 수 없습니다.

1

조금 더 논리를 추가하면 더 나은 방법이 될 수 있지만 이는 저에게 효과적입니다.

0

나는 비슷한 상황에 처한 후에이 질문을 파헤 쳤다. @ Peter의 답변은 거의 내가 찾고있는 것이지만 몇 가지 변경 사항을 추가했습니다.

/** 
* 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(); 
    } 
} 

는 사용 대신 refresh()hydrate() 당신이 1 개 이하 SELECT 질의를 수행하는 것을 의미한다.

나는이 문제에 대한 답을 얻을 가능성이 있음을 알고있다. (나는 적어도 당신이 가지고 있기를 바란다.) 그러나 나는 같은 질문을하는 사람들을 위해 내 솔루션을 추가 할 것이라고 생각했다.

는 또한 preInsert()if ($this->state() === self::STATE_TDIRTY)

0

은 내가 늦게 여기에 조금 해요 알고 TDIRTY 기록에 적용 제거했지만, 나는 preInsert 후크에서 필드를 업데이트하려고하는 동안 나는 Google에서이 게시물을 발견 . 당신의 목표는 Doctrine-Record를 새로 고치기 만하면 DB에서 업데이트하지 않기 때문에 (내가 이해 한 것에서 ^^)

DB에서 업데이트를 수행하려면 , 나는 추운 코드를 사용해야했다. (나는 "save"를 다시 불러야한다는 것에 놀랐다.)

public function preInsert(Doctrine_Event $event) 
{ 
    /* @var $weighSameDate Doctrine_Collection */ 
    $weighSameDate = Doctrine::getTable('BiometryWeightData') 
     ->createQuery() 
     ->where('user_id=?', $this->getUserId()) 
     ->where('date=?', $this->getDate()) 
     ->execute(); 
    if (count($weighSameDate)) { 
     /* @var $weight BiometryWeightData */ 
     $weight = $weighSameDate->getFirst(); 
     if ($weight->getWeight() != $this->getWeight()) { 
      $previous = clone $this; 
      $this->assignIdentifier($weight->getId()); 
      $this->hydrate($weight->toArray()); 
      $this->setWeight($previous->getWeight()); 

      $this->state(Doctrine_Record::STATE_DIRTY); // STATE_DIRTY to do an update 
      $this->save(); 
     } 
     $event->skipOperation(); 
     return; 
    } 
    parent::preInsert($event); 
}