Symfony+;Doctrine onFlush-如何跳过实体的插入和更新
我有以下用例: 我阅读了多个具有集合(项)的实体(项目) 为了实现特定的功能,我确实更改了项目实体并将内容添加到items集合,但我不希望保存这些更改Symfony+;Doctrine onFlush-如何跳过实体的插入和更新,symfony,doctrine,Symfony,Doctrine,我有以下用例: 我阅读了多个具有集合(项)的实体(项目) 为了实现特定的功能,我确实更改了项目实体并将内容添加到items集合,但我不希望保存这些更改 namespace App\EventListener; use Doctrine\ORM\Event\OnFlushEventArgs; class DoctrineFlushListener { /** * @param OnFlushEventArgs $args */ public functio
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()”以获取线索
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)
它将使您的实体“忘记”,因此不会保存对其所做的任何更改。您在进行更改后是否尝试重新计算关联更改集 更改基本字段或关联需要显式触发受影响实体的变更集的重新计算。这可以通过调用
这就是显式要求您执行的操作。在进行更改后,您是否尝试重新计算关联更改集 更改基本字段或关联需要显式触发受影响实体的变更集的重新计算。这可以通过调用
这就是显式要求您执行的操作。我正在删除一个实体,而不是更改其属性。不过还在挖。我来试一试。你也谈到了改变收藏。因此,我建议首先删除集合项,重新计算这些实体,然后将它们从工作单元中分离。我删除的是实体,而不是更改其属性。不过还在挖。我来试一试。你也谈到了改变收藏。所以我建议首先删除集合项,重新计算这些实体,然后将它们从工作单元中分离出来。