我与2个实体有很多很多关系。由于某些原因,preupdate,doctrine为子实体添加了新的id。所有注释都是沿实体类型设置的。那么我怎样才能阻止学说在preupdate上设置新的ID?
预订实体
/**
* 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;
添加新的预订和删除工作,只有当我向现有预订添加新客人时,才会向该新客人分配新ID。在坚持学说之前我已经检查了booking
对象及其文件,但是当我在preupdate
监听器中调试它时,新的guest虚拟机有了新的id(首先可用)。
以下是我的addGuest的样子
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
传递给行动,结果是一样的。
答案 0 :(得分:0)
如果有人需要,我会提出解决方案:
我将所有访客ID存储在array var中,然后我从预订中删除所有访客,刷新然后从存储库中获取带有ID的访客并将其逐个添加到预订和刷新。这样,学说不会创建重复的客人。
$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();