利用符号学和教义,我有一个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/

10-13 08:56