Symfony+;Doctrine onFlush-如何跳过实体的插入和更新

Symfony+;Doctrine onFlush-如何跳过实体的插入和更新,symfony,doctrine,Symfony,Doctrine,我有以下用例: 我阅读了多个具有集合(项)的实体(项目) 为了实现特定的功能,我确实更改了项目实体并将内容添加到items集合,但我不希望保存这些更改 namespace App\EventListener; use Doctrine\ORM\Event\OnFlushEventArgs; class DoctrineFlushListener { /** * @param OnFlushEventArgs $args */ public functio

我有以下用例: 我阅读了多个具有集合(项)的实体(项目)

为了实现特定的功能,我确实更改了项目实体并将内容添加到items集合,但我不希望保存这些更改

namespace App\EventListener;

use Doctrine\ORM\Event\OnFlushEventArgs;

class DoctrineFlushListener
{
    /**
     * @param OnFlushEventArgs  $args
     */
    public function onFlush(OnFlushEventArgs  $args)
    {
        $em = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            if (method_exists($entity, 'isOrmSkipInsert')) {
                if ($entity->isOrmSkipInsert()) {
                    $uow->remove($entity);
                }
            }
        }

        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            if (method_exists($entity, 'isOrmSkipSave')) {
                if ($entity->isOrmSkipSave()) {
//                    $uow->refresh($entity);
                    //$uow->markReadOnly($entity);
//                    $uow->detach($entity);
                }
            }
        }
    }
}
还涉及其他几个实体,当我保存这些实体时,所有更改都会被保存(项目更新和项目插入)

我试图用条令中的onFlush事件解决这个问题,但它并不总是有效:

  • 我不知道如何从更新中删除实体(我使用detach),但这是不推荐的
  • 在某些情况下,我会出现如下错误:

    通过关系“App\entity\Item\project”找到了一个新实体,该关系未配置为级联实体的持久化操作:Proxies\uuuu CG\uuuu\App\entity\Project@00000 00042a2548f0000000067efb063。要解决此问题,请对此未知实体显式调用EntityManager#persist(),或在mappin中配置级联持久化此关联 例如@ManyToOne(..,cascade={“persist”})。如果找不到导致问题的实体,请执行“App\entity\Project#_toString()”以获取线索

App\EventListener\DoctrineFlushListener.php
namespace App\EventListener;

use Doctrine\ORM\Event\OnFlushEventArgs;

class DoctrineFlushListener
{
    /**
     * @param OnFlushEventArgs  $args
     */
    public function onFlush(OnFlushEventArgs  $args)
    {
        $em = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            if (method_exists($entity, 'isOrmSkipInsert')) {
                if ($entity->isOrmSkipInsert()) {
                    $uow->remove($entity);
                }
            }
        }

        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            if (method_exists($entity, 'isOrmSkipSave')) {
                if ($entity->isOrmSkipSave()) {
//                    $uow->refresh($entity);
                    //$uow->markReadOnly($entity);
//                    $uow->detach($entity);
                }
            }
        }
    }
}
服务业。yaml

namespace App\EventListener;

use Doctrine\ORM\Event\OnFlushEventArgs;

class DoctrineFlushListener
{
    /**
     * @param OnFlushEventArgs  $args
     */
    public function onFlush(OnFlushEventArgs  $args)
    {
        $em = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            if (method_exists($entity, 'isOrmSkipInsert')) {
                if ($entity->isOrmSkipInsert()) {
                    $uow->remove($entity);
                }
            }
        }

        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            if (method_exists($entity, 'isOrmSkipSave')) {
                if ($entity->isOrmSkipSave()) {
//                    $uow->refresh($entity);
                    //$uow->markReadOnly($entity);
//                    $uow->detach($entity);
                }
            }
        }
    }
}
    app.doctrine.flush:
        class: App\EventListener\DoctrineFlushListener
        tags:
            - { name: doctrine.event_listener, event: onFlush }
#            - { name: doctrine.event_listener, event: preFlush }
#            - { name: doctrine.event_listener, event: prePersist }

欢迎任何意见

我不是100%,但我认为您可以使用
$entityManage->clear($project)


它将使您的实体“忘记”,因此不会保存对它所做的任何更改。

我不是100%,但我认为您可以使用
$entityManage->clear($project)


它将使您的实体“忘记”,因此不会保存对其所做的任何更改。

您在进行更改后是否尝试重新计算关联更改集

更改基本字段或关联需要显式触发受影响实体的变更集的重新计算。这可以通过调用


这就是显式要求您执行的操作。

在进行更改后,您是否尝试重新计算关联更改集

更改基本字段或关联需要显式触发受影响实体的变更集的重新计算。这可以通过调用


这就是显式要求您执行的操作。

我正在删除一个实体,而不是更改其属性。不过还在挖。我来试一试。你也谈到了改变收藏。因此,我建议首先删除集合项,重新计算这些实体,然后将它们从工作单元中分离。我删除的是实体,而不是更改其属性。不过还在挖。我来试一试。你也谈到了改变收藏。所以我建议首先删除集合项,重新计算这些实体,然后将它们从工作单元中分离出来。