获取旧数据在preUpdate中,使用Sonata Admin Bundle。

12

我有一个product实体,它有一个images字段,存储从产品中获取的图像名称,但是这些图像名称取决于唯一的part_number字段。因此,如果用户在零件号上犯了错误并要进行编辑,那么我也必须更改图像名称。

我尝试了这个方法,但是它不起作用:

// class ProductsAdmin extends Admin

public function preUpdate($product) {

    $old_product = $this->getSubject();

    if ($old_product->getPartNumber() != $product->getPartNumber)
    {
         // change file names
    }

    $this->saveFile($product);
}

如何在preUpdate()函数中获取原始行?

2个回答

22
根据从官方SonataAdmin谷歌论坛中获取的话题: https://groups.google.com/forum/#!topic/sonata-devs/0zML6N13i3U 您需要使用UnitOfWork类: http://www.doctrine-project.org/api/orm/2.3/class-Doctrine.ORM.UnitOfWork.html

按照以下方式进行:

public function preUpdate($object)
{
    $em = $this->getModelManager()->getEntityManager($this->getClass());
    $original = $em->getUnitOfWork()->getOriginalDocumentData($object);
}

因此,您将获得您的数据库实体的值数组。 例如:要访问实体的password值,请执行以下操作:

$password = $original['password'];

就这些了。 享受吧 :)


21
请记住,在使用mongoDB时,您将在unitOfWork上使用'getOriginalDocumentData'方法,但是在mysql中,您需要使用'getOriginalEntityData'。 - Geert Wille

0

如果你在preUpdate函数中执行Doctrine查询以从数据库获取产品,那么你将得到旧对象。然后进行比较,就可以继续了。


据我记得,Doctrine的创建者不建议使用getUnitOfWork()。因此,这个解决方案应该更好。 - Darius.V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接