【问题标题】:Symfony2 embedded Type collection duplicate on updateSymfony2 嵌入式类型集合在更新时重复
【发布时间】: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 上循环调用flushclear 的方式而创建了重复的实体。

标签: php forms symfony doctrine-orm


【解决方案1】:

我想出了解决方案,以防有人需要:

我将所有来宾 id 存储在数组 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多