2013-10-24 70 views
1

在doctine中更新实体一对多关系的最佳方法是什么? 例如:我有一个名为booking的实体,映射到许多访客实体。在Symfony 2/Doctrine 2中更新实体一对多关系的最佳方法

编辑预订时,可以通过添加或删除宾客来更改宾客人数。 目前,我计算了提交的客人人数,如果他们与当前的客人人数不同,我会删除预订客人并重新添加新客人!

对我来说这似乎不正确,并想知道其他人如何解决这个问题。

代码示例:

if (count($collection)) { 
     $numberGuests = count($this->getEntity()->getGuests()); 
     foreach ($collection as $guest) { 
      if ($numberGuests != count($guests)) { 
       // delete guest if the number has changed 
       $this->getGuestManager()->delete($guest); 
      } else { 
       // update entity 
       $guest->setArrayData(Tools::getData($i, $guests)); 
      } 
     } 
    } 

回答

0

我不认为这是一个最好的办法,但你现在的方式是不正确的。为什么如果用户修改客人,但号码仍然相同(他从列表中删除一个客人,但添加了一个客人)?

无论如何,我不认为这是一个糟糕的方法来重新设置关系,每次有人编辑(也许不是最有效的),你只需要设置,从拥有方(客人),预订。 (在多对一的关系,在“多”方必须是拥有方)

我会做,在CONTROLER:

if ($editForm->isValid()) { 

     //find all guests entities that has this booking related 
     $oldguests=$em->getRepository('YourBundle:Guest')->findby(array("booking"=>$entity)); 
     //well you will need to custom a little bit better this "findby" 

     foreach($oldguest as $guest){ 
      //remove the booking for that guest. So that guest won't have any booking linked 
      $guest->removeBooking(); 
      $em->persist($guest); 
     } 
     //now we make the link with guest and booking 
     //$form->submit($request) should have set the current entity with the current guests the user selected 
     foreach($entity->getGuests() as $currentguest){ 
      $currentguest->setBooking($entity); 
      $em->persist($guest); 
     } 

     $em->persist($entity); 
     $em->flush(); 

    } 

而且在客人实体我想补充的功能removeUser

如果你创建在做什么控制器做GuestRepository.php的功能,并在控制器你只是调用该函数
//guest.php 
public function removeBooking(){ 
     $this->booking=NULL; 
} 

也许是更优雅。

你真的需要照顾关系的拥有方。如果您通过自己的方面允许版本,即更新预订的客人,默认代码app/console将不需要任何类型的定制:两个实体都将被正确更新。

为了简单起见,我们可以这样说:让用户更新关系的拥有方=>一切都是自动的。让用户更新关系=>手动定制所需的反面。 (这对多对多关系是一样的)。

希望这会有所帮助。

+0

感谢您的评论。你说的话确实有道理!关于你的问题:为什么如果用户修改客人,但号码仍然相同(他从列表中删除一个客人,但添加了一个新客人)? - 不,它不删除并添加一个新的 - 它更新。如果号码不同,它只会删除和添加新的客人。 –

+0

随着你的代码 - 如果我们从客人删除预订 - 预订将是多余的。你会在重新链接后删除这个吗? –

相关问题