Php 更新Symfony 2/Doctrine 2中实体一对多关系的最佳方法
在doctine中更新实体一对多关系的最佳方式是什么? 例如:我有一个名为booking的实体,它将一个实体映射到多个来宾实体 编辑预订时,可以通过添加或删除客人来更改客人数量。 目前,我统计提交的客人数量,如果他们与当前的客人数量不同,我会删除预订的客人并重新添加新的客人 对我来说,这似乎不正确,我想知道其他人是如何处理这件事的 代码示例:Php 更新Symfony 2/Doctrine 2中实体一对多关系的最佳方法,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在doctine中更新实体一对多关系的最佳方式是什么? 例如:我有一个名为booking的实体,它将一个实体映射到多个来宾实体 编辑预订时,可以通过添加或删除客人来更改客人数量。 目前,我统计提交的客人数量,如果他们与当前的客人数量不同,我会删除预订的客人并重新添加新的客人 对我来说,这似乎不正确,我想知道其他人是如何处理这件事的 代码示例: if (count($collection)) { $numberGuests = count($this->getEnti
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));
}
}
}
我认为没有最好的方法,但你现在的方法是不正确的。为什么如果用户修改了来宾,但编号仍然相同(他从列表中删除了一个来宾,但添加了一个新的来宾) 无论如何,我不认为每次有人编辑(也许不是最有效的)关系时“重置”关系是一种不好的方法,你只需要从拥有方(客人)设置预订。(在多对一关系中,“多”方必须是拥有方) 我会在Controller中这样做:
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中创建一个函数来执行控制器正在执行的操作,并且在控制器中只调用该函数,那么可能会更优雅
你真的需要照顾好这段关系的拥有方。如果您允许通过拥有方进行编辑,即使用预订更新来宾,则默认代码app/console将为您提供无需任何定制的功能:两个实体都将正确更新
为了简单起见,我们可以这样说:让用户更新关系的拥有方=>一切都是自动的。让用户更新关系的反面=>需要手动自定义。(多对多关系也是如此)
希望这能有所帮助。谢谢您的评论。你说的很有道理!关于您的问题:为什么用户修改了来宾,但编号仍然相同(他从列表中删除了一个来宾,但添加了一个新的来宾)?-不,它不会删除和添加一个新的-它会更新。如果号码不同,它只会删除和添加新客人。使用您的代码-如果我们从客人中删除预订-预订将是多余的。你会在重新链接后删除这个吗?