如果一对多关联发生变化,symfony 事件侦听器 preUpdate 确实会被调用



我有一个实体与另一个实体有OneToMany关系。

含义实体

/**
* One Meaning has Many Tags.
*
* @ORMOneToMany(targetEntity="Tag", mappedBy="meaning")
*/
private $tags;

标记实体

/**
* Many Tags have One Meaning.
*
* @ORMManyToOne(targetEntity="Meaning", inversedBy="tags")
* @ORMJoinColumn(name="meaning_id", referencedColumnName="id")
*/
private $meaning;

我注册了一个preUpdateprePersist教义事件的事件侦听器。

服务.yml

tag.event_listener.meaning_tag_persister:
class: TagBundleEventListenerMeaningTagsPersister
tags:
- { name: doctrine.event_listener, event: preUpdate, method: preUpdate }
- { name: doctrine.event_listener, event: prePersist, method: prePersist }

在此事件侦听器中,我所做的只是在tag实体中设置meaning

含义标签每姐妹.php

/**
* Call before an entity gets updated
*
* @param PreUpdateEventArgs $args
*/
public function preUpdate(PreUpdateEventArgs $args)
{
/** @var Entry $object */
$object = $args->getObject();
if (!$object instanceof Meaning) {
return;
}
/** @var Tag $tag */
foreach($object->getTags() as $tag) {
$tag->setMeaning($object);
}
}

prePersist方法看起来完全相同。每当我创建新的Meaning实体时,都会使用适当的方法调用事件侦听器。当我更新Meaning实体时,事件侦听器也可以工作,但前提是我更新其"正常"属性之一,如name。如果我更改任何tagsdoctrine无法将其识别为已更改的实体(这是正确的,因为Meaning实体本身没有更改)。

但是,当Meaning实体更新时,我仍然需要更新每个Tag中的meaning。我还必须从不再与该Meaning关联的任何Tag中删除meaning

事件侦听器是实现此目的的正确方法吗?如果是,如果只有tags发生了变化,如何让Meaning实体触发preUpdate事件?如果没有,通过Meaning实体更新所有关联的Tag实体的适当方法是什么?

这里的问题是PreUpdate不处理文档中所述的Associations更改:

。在这种情况下,永远不允许更改更新实体的关联,因为 Doctrine 无法保证在刷新操作的此时正确处理参照完整性。

教义#更新前

若要验证,请在控制器中执行相同的代码,它将保留更改。

您正在使用应添加的学说生命周期事件

/** @Entity @HasLifecycleCallbacks */

到您的MeaningTag实体。

参考:教义生命周期回调

相关内容

  • 没有找到相关文章

最新更新