Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2嵌入式类型集合在更新时重复_Php_Forms_Symfony_Doctrine Orm - Fatal编程技术网

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

Php Symfony2嵌入式类型集合在更新时重复,php,forms,symfony,doctrine-orm,Php,Forms,Symfony,Doctrine Orm,我与2个实体有多对多关系。出于某些原因,在预更新时,条令会向子实体添加新ID。所有注释都是沿着图元类型设置的。那么,如何防止在预更新时设置新ID 编辑: 预订实体 /** * Bookings * * * @ORM\Table() * @ORM\Entity(repositoryClass="...\Entity\BookingRepository") * @ORM\HasLifecycleCallbacks * */ class Booking { /** * @var integer *

我与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 listener中调试它时,新来宾首先有了新的id

编辑2: 这是我的客人的样子

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做了很多实验

我刚刚注意到,由于酒店以复数形式命名,我是否应该将方法更改为复数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传递给action,结果是一样的。

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

我将所有来宾id存储在数组var中,然后从booking、flush中删除所有来宾,然后使用id从存储库中获取来宾,并将它们逐个添加到booking和flush中。这种方法不会创建重复的来宾

    $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();

你能说得更具体些吗?你到底在说什么?提供您正在使用的代码怎么样?您的addGuests方法在预订实体中是什么样子的?另外,在持久化实体的地方,代码看起来像什么?事实上,我遇到过一个类似的问题,由于我在EntityManager上以循环方式调用flush和clear,所以创建了重复的实体。