如何使用具有学说的事件侦听器来更改相关实体

时间:2015-10-15 11:14:06

标签: php symfony doctrine-orm

使用Symfony和Doctrine,我有一个User实体和一个Address实体。每个用户可以拥有0个或更多地址,其中一个是他的默认地址。

因此,当我将默认地址从一个更改为另一个时,我应该将其设置为默认地址,将其他地址设置为默认地址(布尔字段)。

我尝试使用事件监听器这样做,所以当Address实体更新时,我启动了更新后事件,将所有其他地址设置为非默认值,如下所示:

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);
                }
            }
        }
    }
}

代码执行正确且不显示错误,但不保存非默认地址的更改。

1 个答案:

答案 0 :(得分:1)

如果User只能有一个默认Address,您还应该以某种方式确保您的数据库模型仅支持一个地址作为默认地址。

我建议将Address作为User关系的当前默认地址(Address之间的额外一对一关联($defaultAddress )和User旁边与地址的一对多关系)。然后你可以这样做:

$user->setDefaultAddress($address);
$em->persist($user);
$em->flush();

这可以通过一个数据库操作与示例中的两个操作完成(在第一次操作刷新后调用PostPersist)

现在很容易获得当前的默认地址:

$address = $user->getDefaultAddress();