2015-10-15 59 views
3

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

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

+0

你是否知道你没有坚持你更新的对象?你更新了$ another_address,你坚持$ another_billing_data – jahller

+0

嗨,对不起,我的错。我纠正了问题中的代码。是的,我persis another_address – petekaner

+0

哪里是flush()方法?而且,为什么你每次在foreach循环中实例化em? – Srdjan

回答

1

如果User只能有一个默认值Address您还应该确保您的数据库模型只支持一个地址作为默认地址。

我建议让Address这是(旁边的一对许多与地址的关系)UserAddress$defaultAddress之间的一个额外的一对一协会)当前的默认地址的User关系。然后,你可以简单地这样做:

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

这可以用一个数据库操作在您的例子来完成VS两(PostPersist是第一次运行的冲洗之后调用)

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

$address = $user->getDefaultAddress(); 
+0

这样做很有意义并且会使默认地址在数据模式中可见。谢谢! – petekaner