1

我有 2 张桌子:照片和相册。在相册表中,我有一个包含该相册照片数量的字段。

当我更改相册时更新照片时,我需要更新相册表的照片数量字段以反映更改。

    public function updateObject($values=null)
    {        
        $object = parent::updateObject($values);

        if($this->isNew)
        {
         ...
        }
        else
        {
          $old_album = Doctrine_Core::getTable('Photos')
                        ->find($object->getId())->getAlbums();
          if($old_album != $object->getAlbums()
             //update number of photos
        }
    }

但是$object->getAlbums()总是得到相同的值,$old_album; 就像我删除$old_album得到$object->getAlbums()正确的值一样。

怎么了?

4

1 回答 1

0

您应该改用该doUpdateObject()方法:

protected function doUpdateObject($values)
{
  // this is the album object before the update
  $oldAlbum = clone $this->getObject()->getAlbum();

  // refresh the object with the new values
  parent::doUpdateObject($values);

  // it's an update
  if (!$this->isNew())
  {
    // the old album is removed
    if (!$this->getObject()->get('album_id'))
    {
      // decrease the number of pictures in the old album and save it
      $oldAlbum
        ->setNumberOfPictures($oldAlbum->getNumberOfPictures() - 1)
        ->save();
    }
    elseif ($oldAlbum->get('id') != $this->getObject()->get('album_id'))
    {
      // decrease the number of pictures in the old album and save it
      $oldAlbum
        ->setNumberOfPictures($oldAlbum->getNumberOfPictures() - 1)
        ->save();

      // increase the number of pictures in the current album (save not required)
      $this
        ->getObject()
        ->setNumberOfPictures($this->getObject()->getNumberOfPictures() + 1);
    }
  }
  else
  {
    // increase the number of pictures in the current album (save not required)
    $this
      ->getObject()
      ->setNumberOfPictures($this->getObject()->getNumberOfPictures() + 1);
  }
}

这里有很多代码重复,这不是最好的方法,因为在更新专辑时你总是必须这样做以保持一致性。

整个逻辑应该移到模型中。更好的解决方案应该是使用CountCache文档中此示例中的行为。

于 2012-11-10T16:32:40.730 回答