gpt4 book ai didi

symfony - 在 postPersist 事件中插入教义

转载 作者:行者123 更新时间:2023-12-03 14:29:08 26 4
gpt4 key购买 nike

我想在实体上添加新的 Feed 项并持续更新。我写了这个事件监听器(postUpdate 是一样的):

public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$em = $args->getEntityManager();

if ($entity instanceof FeedItemInterface) {
$feed = new FeedEntity();
$feed->setTitle($entity->getFeedTitle());
$feed->setEntity($entity->getFeedEntityId());
$feed->setType($entity->getFeedType());
if($entity->isFeedTranslatable()) {
$feed->getEnTranslation()->setTitle($entity->getFeedTitle('en'));
}
$em->persist($feed);
$em->flush();
}
}

但我得到了

Integrity constraint violation: 1062 Duplicate entry '30-2' for key 'PRIMARY'



并且在日志 a 中有两个插入:

INSERT INTO interview_scientificdirection (interview_id, scientificdirection_id) VALUES (?, ?) ([30,2]) INSERT INTO interview_scientificdirection (interview_id, scientificdirection_id) VALUES (?, ?) ([30,2])



sciencedirection 是我们想要持久化的实体的多对多关系表。
在前端应用程序中一切正常,但在 Sonata Admin 中我遇到了这个问题:(

最佳答案

如果您需要持久化其他对象,遗憾的是,Doctrine 中的 postPersist 或 postUpdate 处理程序不是正确的选择。今天我遇到了同样的问题,因为我需要在该处理程序中生成一些消息条目。
此时的问题是 postPersist 处理程序被称为 期间刷新事件,而不是之后。因此,您不能在此处保留其他对象,因为之后它们不会被刷新。此外,您不能在 postPersist 处理程序期间调用 flush ,因为这可能会导致重复条目(正如您所经历的那样)。
一种方法是使用来自学说的 onFlush 处理程序,此处记录:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/events.html#onflush
如果您需要插入数据库对象的 id,这只是有问题,因为实体尚未在该处理程序中写入数据库。如果您不需要这些 id,则可以使用 onFlush 事件。
对我来说,解决方案有点不同。我目前正在开发一个 symfony2 项目,并且需要插入的数据库对象的 ID(用于稍后的回调和更新)。
我在 symfony2 中创建了一个新服务,它基本上就像我的消息队列一样。在 postPersist 更新期间,我只是填写队列中的条目。我在 kernel.response 上注册了另一个处理程序,然后将这些条目保存到数据库中。 (类似这样的东西:http://symfony.com/doc/current/cookbook/service_container/event_listener.html)
我希望我在这里不要离题太多,但由于这是我真的很苦恼的事情,我希望有些人可能会发现这很有用。
为此的服务条目是:

 amq_messages_chain:
class: Acme\StoreBundle\Listener\AmqMessagesChain

amqflush:
class: Acme\StoreBundle\Listener\AmqFlush
arguments: [ @doctrine.orm.entity_manager, @amq_messages_chain, @logger ]
tags:
- { name: kernel.event_listener, event: kernel.response, method: onResponse, priority: 5 }

doctrine.listener:
class: Acme\StoreBundle\Listener\AmqListener
arguments: [ @logger, @amq_messages_chain ]
tags:
- { name: doctrine.event_listener, event: postPersist }
- { name: doctrine.event_listener, event: postUpdate }
- { name: doctrine.event_listener, event: prePersist }
您不能使用 doctrine.listener为此,因为这会导致循环依赖(因为您需要服务的实体管理器,但实体管理器需要服务......)
这就像一个魅力。如果您需要更多信息,请不要犹豫,我很高兴为此添加一些示例。

关于symfony - 在 postPersist 事件中插入教义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com