我有以下用例:我读了多个具有集合(项目)的实体(项目)。
为了实现特定功能,我确实更改了Project实体,并向item集合中添加了内容,但我不希望这些更改被保存!。
还有其他几个实体,当我保存这些实体时,所有更改都会保存(项目更新和项目插入)。
我试图通过原则上的onFlush事件解决此问题,但它并不总是有效:
在某些情况下,我会收到类似以下错误:
通过关系'App \ Entity \ Item#project'找到了一个新实体,该关系未配置为级联实体的持久化操作:Proxies__CG __ \ App \ Entity \ Project @ 0000000042a2548f0000000067efb063。解决此问题的方法:在此未知实体上显式调用EntityManager#persist()或配置级联将此关联保留在mappin中g例如@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);
}
}
}
}
}
在services.yaml
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)
它将使学说“忘记”您的实体,因此不会保存对其所做的任何更改。