Symfony2 дублирует коллекцию типов при обновлении

0

У меня много отношений с двумя сущностями. По какой-то причине в preupdate доктрина добавляет новые идентификаторы дочерним объектам. Все аннотации настраиваются прямо по типам сущностей. Итак, как я могу запретить доктрине устанавливать новые идентификаторы в preupdate?

Редактировать:

Объект бронирования

/**
* Bookings
*
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="...\Entity\BookingRepository")
* @ORM\HasLifecycleCallbacks
*
*/
class Booking
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var ArrayCollection $guests
 *
 * @ORM\ManyToMany(targetEntity="...\Entity\Guest", inversedBy="bookings", cascade={"persist"})
 * @ORM\JoinTable(name="Bookings_Guests",
 *      joinColumns={@ORM\JoinColumn(name="booking_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="guest_id", referencedColumnName="id")}
 * )
 *
 */
protected $guests;

Гостевой объект

/**
* Guests
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="...\Entity\GuestRepository")
* @ORM\HasLifecycleCallbacks
*/
class Guest
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var \Doctrine\Common\Collections\ArrayCollection $bookings
 * @ORM\ManyToMany(targetEntity="...\Entity\Booking", mappedBy="guests")
 */
protected $bookings;

Добавьте новое бронирование и удалите работу, только когда я добавлю нового гостя к существующему заказу, что доктрина назначает новый идентификатор новому гостю. Прежде чем упорствовать в доктрине, я осмотрел объект booking и его файл, но когда я отлаживаю его в preupdate listener, новый гость имеет новый идентификатор (первый доступный).

Изменить 2:

Вот как выглядят мои addGuests

public function addGuest(\Milos\RafailoviciBundle\Entity\Guest $guests)
{

//  $guests->addBooking($this);
    $this->guests[] = $guests;

//  if (!$this->guests->contains($guests)) {
//      $this->guests[] = $guests;
//      $guests->addBooking($this);
//  }
    return $this;
}

Как вы можете видеть, я много экспериментировал с addGuest.

Я только уведомления, так как свойство называется во множественном числе guests должны изменить метод множественного addGuests.

Любой путь здесь - часть контроллера:

public function editBookingAction(Request $request, Booking $booking){

    $form = $this->createForm(new BookingEditType(), $booking);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        // even tried with $em->persist($booking); result is the same
        $em->flush();

        //...
    }

    //...
}

Я даже пробовал с $id вместо того, чтобы $booking был передан в действие, результат такой же.

Теги:
forms
doctrine2

1 ответ

0
Лучший ответ

Я придумал решение, если кому-то это нужно:

Я храню все гостевые идентификаторы в массиве var, а затем я удаляю всех гостей от бронирования, флеш, а затем забираю гостей из хранилища с идентификатором и добавляю их один за другим к бронированию и флеш. Таким образом, доктрина не создает двойных гостей.

    $ids = [];
    foreach($booking->getGuests() as $guest) {
        $ids[] = $guest->getId();
        $booking->getGuests()->removeElement($guest);
    }

    $this->em->flush();

    foreach($ids as $id) {
        $guest = $this->em->getRepository('MilosRafailoviciBundle:Guest')->find($id);
        $booking->addGuest($guest);
    }

    $this->em->flush();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню