2013-10-24 3 views
1

Каков наилучший способ обновить сущности от одного до многих отношений в doctine? Например: у меня есть сущность, называемая бронированием, с сопоставленной для многих объектов-гостей.Лучший способ обновить сущность от одного до многих отношений в 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

Я не думаю, что это лучший способ, но так, как у вас сейчас не является правильным. Почему, если пользователь изменяет гостей, но номер остается неизменным (он удаляет одного гостя из списка, но добавляет новый)?

В любом случае, я не думаю, что это плохой подход к «Сбросить» отношения каждый раз, когда кто-то редактирует (может быть, не самый эффективный, хотя) вам просто нужно будет установить с стороны владельца (гостя) бронирование. (В многих одно отношении, «многие» сторона должна быть сторона владеющей)

Я хотел бы сделать, что в контроллере:

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, которая выполняет то, что делает контроллер, а в контроллере вы просто вызываете эту функцию.

Вам действительно нужно позаботиться о том, чтобы иметь отношение к отношениям. Если вы разрешаете выпуск через собственную сторону, то есть, обновляя гостей при бронировании, приложение/консоль по умолчанию дает вам совсем никакой необходимости в настройке: оба объекта будут правильно обновлены.

Чтобы это было просто, мы можем сказать, что: пусть пользователь обновит собственную сторону отношения => все автоматически. Позвольте пользователю обновить обратную сторону отношения => ручная настройка. (это одно и то же для многих и многих отношений).

Надеюсь, это поможет.

+0

Спасибо за замечание. То, что вы говорите, имеет смысл! Что касается вашего вопроса: почему, если пользователь изменяет гостей, но номер остается тем же (он удаляет одного гостя из списка, но добавляет новый)? - Нет, он не удаляет и не добавляет новый - он обновляется. Он удаляет и добавляет новых гостей, если номер отличается. –

+0

С кодом - если мы удалим бронирование у гостя - бронирование будет излишним. Удаляете ли вы это после релинка? –

Смежные вопросы