我有一个实体与另一个实体有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;
我注册了一个preUpdate
和prePersist
教义事件的事件侦听器。
服务.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
。如果我更改任何tags
则doctrine
无法将其识别为已更改的实体(这是正确的,因为Meaning
实体本身没有更改)。
但是,当Meaning
实体更新时,我仍然需要更新每个Tag
中的meaning
。我还必须从不再与该Meaning
关联的任何Tag
中删除meaning
。
事件侦听器是实现此目的的正确方法吗?如果是,如果只有tags
发生了变化,如何让Meaning
实体触发preUpdate
事件?如果没有,通过Meaning
实体更新所有关联的Tag
实体的适当方法是什么?
这里的问题是PreUpdate
不处理文档中所述的Associations
更改:
。在这种情况下,永远不允许更改更新实体的关联,因为 Doctrine 无法保证在刷新操作的此时正确处理参照完整性。
教义#更新前
若要验证,请在控制器中执行相同的代码,它将保留更改。
您正在使用应添加的学说生命周期事件
/** @Entity @HasLifecycleCallbacks */
到您的Meaning
和Tag
实体。
参考:教义生命周期回调