【发布时间】:2014-11-15 17:44:05
【问题描述】:
我与 2 个实体有多对多的关系。出于某种原因,在预更新时,学说会为子实体添加新的 id。所有注释都沿实体类型设置。那么如何防止学说在预更新时设置新的 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 侦听器中调试它时,新来宾具有新 id(第一个可用)。
编辑 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 传递给操作,结果是一样的。
【问题讨论】:
-
您能说得更具体些吗?你在说什么预更新?提供您正在使用的代码怎么样?
-
您的
addGuests方法在 Booking 实体中是什么样的?另外,你在持久化实体的地方的代码是什么样的?我实际上遇到了一个类似的问题,由于我在 EntityManager 上循环调用flush和clear的方式而创建了重复的实体。
标签: php forms symfony doctrine-orm