我有以下用例:我读取了具有集合(项目)的多个实体(项目)。
为了实现特定功能,我确实更改了项目实体并将内容添加到项目集合中,但我不希望保存这些更改!。
还有涉及其他几个实体,当我保存这些实体时,所有更改都会被保存(项目更新和项目插入)。
我试图用原则中的 onFlush 事件来解决这个问题,但它并不总是有效:
在某些情况下,我会收到如下错误:
通过关系“App\Entity\Item#project”发现了一个新实体,该实体未配置为级联实体的持久操作:Proxies__CG__\App\Entity\Project@00000 00042a2548f0000000067efb063。要解决此问题: 对此未知实体显式调用 EntityManager#persist() 或配置级联以在映射中保留此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行“App\Entity\Project#__toString()”来获取线索。
应用\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);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 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 }
Run Code Online (Sandbox Code Playgroud)
欢迎任何意见!
| 归档时间: |
|
| 查看次数: |
2568 次 |
| 最近记录: |