在doctine中更新实体一对多关系的最佳方法是什么? 例如:我有一个名为booking的实体,其中有一个映射到多个Guest实体。
编辑预订时,可以通过添加或删除访客来更改访客数量。 目前,我统计了提交的客人人数,如果他们与当前的客人人数不同,我会删除预订客人并重新添加新客人!
对我而言,这似乎不对,想知道别人如何接近这一点。
代码示例:
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 :(得分:0)
我认为没有最好的方法,但你现在的方式是不正确的。为什么用户修改了访客但数字仍然相同(他从列表中删除了一个访客但添加了一个新访客)?
无论如何,我不认为每次有人编辑时“重置”这种关系是不好的方法(可能不是最有效的),你只需要从拥有方(客人)预订。 (在多对一关系中,“很多”方面必须是拥有方)
我会在控制器中这样做:
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();
}
在Guests实体中,我将添加函数removeUser
//guest.php
public function removeBooking(){
$this->booking=NULL;
}
如果在GuestRepository.php中创建一个执行控制器正在执行操作的函数,并且在控制器中只调用该函数,则可能更优雅。
你真的需要照顾这段关系的拥有方。如果你允许通过拥有版本,即更新客人的预订,默认代码应用程序/控制台让你根本不需要任何类型的自定义:两个实体都将被正确更新。
为了简单起见,我们可以这样说:让用户更新关系的拥有方=>一切都是自动的。让用户更新关系的反面=>需要手动定制。 (对于许多人而言,这是相同的。)
希望这有帮助。