利用符号学和教义,我有一个User
实体和一个Address
实体。每个用户可以有0个或多个地址,其中一个是他的默认地址。
因此,当我将默认地址从一个更改为另一个时,我应该将该地址设置为默认地址,而将其他地址设置为非默认地址(布尔字段)。
我尝试使用事件侦听器来执行此操作,因此当Address
实体更新时,我启动了post updated event,将所有其他地址设置为非默认,如下所示:
class AddresssListener
{
public function postUpdate(LifecycleEventArgs $event)
{
$entity = $event->getEntity();
if ($entity instanceof Address) {
$this->changeDefaultAddress($entity, $event);
}
}
private function changeDefaultAddress($address, $event)
{
if ($address->getIsDefault() == true) {
foreach ($address->getUser()->getBillingDatas() as $another_address) {
if ($address != $another_address) {
$another_address->setIsDefault(false);
$em = $event->getEntityManager();
$em->persist($another_address);
}
}
}
}
}
代码执行正确,没有显示错误,但对非默认地址的更改不会保存。
最佳答案
如果User
只能有一个默认的Address
地址,那么还应该确保数据库模型只支持一个默认地址。
我建议将Address
作为当前默认地址与User
的关系(在Address
($defaultAddress
)和User
之间的另一个一对一关联,位于您与地址的一对多关系旁边)。然后你可以这样做:
$user->setDefaultAddress($address);
$em->persist($user);
$em->flush();
在您的示例中,这可以通过一个数据库操作而不是两个来完成(在刷新第一个操作之后调用postpersist)
现在很容易得到当前的默认地址:
$address = $user->getDefaultAddress();
关于php - 如何使用带有事件学说的事件监听器更改相关实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33147039/