Я не думаю, что это лучший способ, но так, как у вас сейчас не является правильным. Почему, если пользователь изменяет гостей, но номер остается неизменным (он удаляет одного гостя из списка, но добавляет новый)?
В любом случае, я не думаю, что это плохой подход к «Сбросить» отношения каждый раз, когда кто-то редактирует (может быть, не самый эффективный, хотя) вам просто нужно будет установить с стороны владельца (гостя) бронирование. (В многих одно отношении, «многие» сторона должна быть сторона владеющей)
Я хотел бы сделать, что в контроллере:
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
//guest.php
public function removeBooking(){
$this->booking=NULL;
}
Возможно, более элегантно, если вы создаете функцию в GuestRepository.php, которая выполняет то, что делает контроллер, а в контроллере вы просто вызываете эту функцию.
Вам действительно нужно позаботиться о том, чтобы иметь отношение к отношениям. Если вы разрешаете выпуск через собственную сторону, то есть, обновляя гостей при бронировании, приложение/консоль по умолчанию дает вам совсем никакой необходимости в настройке: оба объекта будут правильно обновлены.
Чтобы это было просто, мы можем сказать, что: пусть пользователь обновит собственную сторону отношения => все автоматически. Позвольте пользователю обновить обратную сторону отношения => ручная настройка. (это одно и то же для многих и многих отношений).
Надеюсь, это поможет.
Спасибо за замечание. То, что вы говорите, имеет смысл! Что касается вашего вопроса: почему, если пользователь изменяет гостей, но номер остается тем же (он удаляет одного гостя из списка, но добавляет новый)? - Нет, он не удаляет и не добавляет новый - он обновляется. Он удаляет и добавляет новых гостей, если номер отличается. –
С кодом - если мы удалим бронирование у гостя - бронирование будет излишним. Удаляете ли вы это после релинка? –