Doctrine listener - 仅在字段更改时运行操作

时间:2010-01-13 19:01:56

标签: php doctrine

如何检查字段是否已更改?

我想仅在特定字段发生变化时触发preSave()中的操作,e.q。

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

问题是如何获得此$bodyBefore$bodyNow

3 个答案:

答案 0 :(得分:23)

请不要再次获取数据库!这适用于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
  }
}

也可以查看documentation

答案 1 :(得分:3)

Travis的答案几乎是正确的,因为问题是当你进行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)
  {
    ...
  }
}

答案 2 :(得分:-1)

试试这个。

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);
   }   
}