У меня много отношений с двумя сущностями. По какой-то причине в 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, новый гость имеет новый идентификатор (первый доступный).
Вот как выглядят мои 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
был передан в действие, результат такой же.
Я придумал решение, если кому-то это нужно:
Я храню все гостевые идентификаторы в массиве 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();