Слушатель доктрины - выполненное действие, только если поле изменилось

Как я проверяю, изменилось ли поле?

Я хотел бы инициировать действие в preSave() только если определенное поле изменилось, e.q.

public function preSave() {
    if ($bodyBefore != $bodyNow) {
         $this->html = $this->_htmlify($bodyNow);
    }
} 

Вопрос состоит в том, как получить это $bodyBefore и $bodyNow

15
задан j0k 5 August 2012 в 09:31
поделиться

3 ответа

Пожалуйста, не извлекайте базу данных снова! Это работает для Doctrine 1.2, я не тестировал более низкие версии.

// in your model class
public function preSave($event) {
  if (!$this->isModified())
    return;

  $modifiedFields = $this->getModified();
  if (array_key_exists('title', $modifiedFields)) {
    // your code
  }
}

Проверьте также документацию.

23
ответ дан 1 December 2019 в 02:55
поделиться

Попробуйте это.

public function preSave($event)
{
   $id = $event->getInvoker()->id;
   $currentRecord = $this->getTable()->find($id);

   if ($currentRecord->body != $event->getInvoker()->body)
   {
      $event->getEnvoker()->body = $this->_htmlify($event->getEnvoker()->body);
   }   
}
-1
ответ дан 1 December 2019 в 02:55
поделиться

Ответ Трэвиса был почти правильным, потому что проблема в том, что объект перезаписывается, когда вы выполняете запрос Doctrine. Так что решение следующее:

public function preSave($event)
{
  // Change the attribute to not overwrite the object
  $oDoctrineManager = Doctrine_Manager::getInstance(); 
  $oDoctrineManager->setAttribute(Doctrine::ATTR_HYDRATE_OVERWRITE, false); 

  $newRecord = $event->getInvoker();
  $oldRecord = $this->getTable()->find($id);

  if ($oldRecord['title'] != $newRecord->title)
  {
    ...
  }
}
3
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: