Symfony2嵌入式类型集合在更新时重复

时间:2014-11-15 17:44:06

标签: php forms symfony doctrine-orm

我与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(首先可用)。

编辑2:

以下是我的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传递给行动,结果是一样的。

1 个答案:

答案 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();