如何检查实体在原则2中是否发生了变化?

2022-08-30 13:36:08

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

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

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

那代码打印总是,我也尝试刷新之前检查工作单元,但没有工作。false

有人有建议吗?


答案 1

我要检查的第一件事是你的setName函数实际上正在做一些事情($this-> name = $name...)如果它已经正常工作,则可以在 services.yml 上定义一个事件侦听器,该事件侦听器在调用 flush 时触发。

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

然后定义实体列表

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 事件,从数组中获取实体。

顺便说一句,要触发此类事件,您需要在实体上添加@ORM\HasLifecycleCallbacks。


答案 2

我不需要/不想为我的情况创建监听器,所以我最终得到了

$product->setName('A different name');
$uow = $entityManager->getUnitOfWork();
$uow->computeChangeSets();
if ($uow->isEntityScheduled($product)) {
    // My entity has changed
}

推荐