如何在Doctrine 2中检查实体是否发生变化? [英] How to check if entity changed in Doctrine 2?

查看:151
本文介绍了如何在Doctrine 2中检查实体是否发生变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要检查持久化实体是否已更改,需要在数据库上进行更新。
我所做的(并没有工作)如下:

I need to check if a persisted entity has changed and needs to be updated on the database. What I made (and did not work) was the following:

$product = $entityManager->getRepository('Product')->find(3);
$product->setName('A different name');

var_export($entityManager->getUnitOfWork()->isScheduledForUpdate($product));

该代码总是打印 false ,我也在检查工作单位之前尝试冲洗,但没有工作。

That code prints always false, I also tried to flush before check the unit of work, but did not work.

任何人都有建议?

推荐答案

首先我检查一下,你的 setName 函数实际上是在做某事($ this-> name = $ name ...)如果它已经在工作,那么您可以在调用flush时触发的services.yml中定义一个事件侦听器。

The first thing I'd check it that your setName function is actually doing something ($this-> name = $name...) If it's already working, then you could define an event listener on your services.yml that is triggered when you call the flush.

entity.listener:
  class: YourName\YourBundle\EventListener\EntityListener
  calls:
    - [setContainer,  ["@service_container"]]
  tags:
    - { name: doctrine.event_listener, event: onFlush }

然后定义EntityListener

Then you define the EntityListener

namespace YourName\YourBundle\EventListener;

use Doctrine\ORM\Event;
use Symfony\Component\DependencyInjection\ContainerAware;

class EntityListener extends ContainerAware
{   

    /**
     * Gets all the entities to flush
     *
     * @param Event\OnFlushEventArgs $eventArgs Event args
     */
    public function onFlush(Event\OnFlushEventArgs $eventArgs)
    {   
        $em = $eventArgs->getEntityManager();
        $uow = $em->getUnitOfWork();

        //Insertions
        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            # your code here for the inserted entities
        }

        //Updates
        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            # your code here for the updated entities
        }

        //Deletions
        foreach ($uow->getScheduledEntityDeletions() as $entity) {
            # your code here for the deleted entities
        }
    }

如果您需要知道哪些实体正在更改,但在之后他们会执行某些操作已经保存到数据库中,只需将实体更改为私有数组,然后定义一个从数组中获取实体的onFlush事件。

If you need to know which entities are being changed, but do something with them after they've been saved to the database, just store the entities changed in a private array, an then define a onFlush event that gets the entities from the array.

BTW,to触发此类事件,您需要在实体上添加@ ORM\HasLifecycleCallbacks。

BTW, to trigger this kind of events you need to add the @ORM\HasLifecycleCallbacks on the entity.

这篇关于如何在Doctrine 2中检查实体是否发生变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆