【问题标题】:Symfony 3 Collection of Forms not persisting foreign keySymfony 3 表单集合不保留外键
【发布时间】:2017-04-03 07:19:13
【问题描述】:

我嵌入了一组表单。添加新记录时,外键始终为空。

有人知道问题出在哪里吗?我尝试循环遍历结果并保留每条记录,但外键仍然为空。

控制器:

 public function newAction(Request $request)
    {
        $bus = new BusVehicles();
        $busAmenities = new BusVehiclesAmenities();
       // dump ($busAmenities);
        //   $this->getDoctrine()->getManager()->persist($busAmenities);
        $bus->addBusVehiclesAmenities($busAmenities);
        $form = $this->createForm(BusVehiclesType::class, $bus);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

            $em = $this->getDoctrine()->getManager();
            $form->get('busVehiclesAmenities')->getData()->map(
                function ($amenities) use ($em, $bus) {

                    $bus->addBusVehiclesAmenities($amenities);
                    $em->persist($amenities);
                }
            );
         //   $em->persist($form->get('busVehiclesAmenities')->getData());
            $em->persist($bus);


            // Adding flash message to our user

            $this->addFlash('success', 'admin.bus.created');


            //  return $this->redirectToRoute('bus_add');

        }
        return [
            'form' => $form->createView(),
        ];
    }

总线实体(父)

/** @ORM\OneToMany(
     *     targetEntity="BusVehiclesAmenities",
     *     mappedBy="busVehicles",
     *     cascade={"persist"}
     * )
     *
     */

    private $busVehiclesAmenities;

    public function __construct()
    {

        $this->busVehiclesAmenities = new ArrayCollection();
    }


    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Add busVehiclesAmenities
     *
     * @param \AppBundle\Entity\BusVehiclesAmenities busVehiclesAmenities
     * @return BusVehicles
     */
    public function addBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities)
    {

        if ($this->busVehiclesAmenities->contains($busVehiclesAmenities)) {
             return;
         }
        $this->busVehiclesAmenities->add($busVehiclesAmenities);
        $busVehiclesAmenities->addBusVehicles($this);

        return $this;
    }

    /**
     * Remove busVehiclesAmenities
     *
     * @param \AppBundle\Entity\BusVehiclesAmenities $busVehiclesAmenities
     */
    public function removeBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities)
    {
        if (!$this->busVehiclesAmenities->contains($busVehiclesAmenities)) {
            return;
        }
        $this->busVehiclesAmenities->removeElement($busVehiclesAmenities);
        $busVehiclesAmenities->removeBusVehicles(this);


    }

    /**
     * Get busVehiclesAmenities
     *
     * @return ArrayCollection
     */
    public function getBusVehiclesAmenities()
    {
        return $this->busVehiclesAmenities;

    }

    /**
     * Set busVehiclesAmenities
     *
     * @param \AppBundle\Entity\BusVehiclesAmenities $busVehiclesAmenities
     * @return ArrayCollection
     */
   public function setBusVehiclesAmenities($busVehiclesAmenities)
    {
        $this->busVehiclesAmenities = $busVehiclesAmenities;

    }

巴士设施实体(儿童):

/**
     *
     * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\BusVehicles", inversedBy="busVehiclesAmenities")
     * @ORM\JoinColumn(name="bus_vehicles_id", referencedColumnName="id")
     */
    private $busVehicles;

    /**
     *
     * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Amenities", inversedBy="amenities")
     * @ORM\JoinColumn(name="amenities_id", referencedColumnName="id")

     *
     */
    private $amenities;

    /**
     * @var float
     * @ORM\Column(name="price", type="float", scale=2)
     */
    protected $price;

    public function __construct()
    {
    }


    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }


    /**
     * Get busId
     *
     * @return integer
     */
    public function getBusVehicles()
    {
        return $this->busVehicles;
    }

    /**
     * Add bus
     *
     * @param \AppBundle\Entity\BusVehicles
     *
     * @return BusVehiclesAmenities
     */
    public function addBusVehicles(BusVehicles $busVehicles)
    {

        $this->busVehicles = $busVehicles;

        //$bus->setBusVehiclesAmenities($this);


        return $this;
    }

    /**
     * Remove bus
     *
     * @param \AppBundle\Entity\BusVehicles
     *
     * @return BusVehiclesAmenities
     */
    public function removeBusVehicles(BusVehicles $busVehicles = null)
    {

        $this->busVehicles = null;

        //$bus->setBusVehiclesAmenities($this);


        return $this;
    }

【问题讨论】:

    标签: php symfony doctrine-orm symfony-forms symfony-3.1


    【解决方案1】:

    您将 BusVehicle 和 Amenity 映射为双向关联。 便利设施的 fk 为空,因为您没有为便利设施设置 BusVehicle。

    您需要实现一个方法,例如:便利设施类中的 setBusVehicle():

    public function setBusVehicle(BusVehicles $bus) {
        $this->busVehicles = $bus;
    }
    

    使用双向映射时,必须从两侧设置对象。

    【讨论】:

    • 一些提示:我不会在实体类名称中使用复数,这是一种不好的做法。除非真的有必要,否则我不会使用双向映射。
    • 感谢您的建议。将尽快修复班级名称并应用您的建议。
    • 感谢您的建议。我已经实现了您建议的代码,我无法将事件保存到 Bus 表。它根本不会持续存在。
    • 没有错误。它根本不会保存到数据库。我得到所有表单提交的数据(使用转储方法检查)
    • 我没有在您的代码中看到您刷新 $em。执行 $em->flush() 以保存实体。
    猜你喜欢
    • 2017-10-18
    • 2021-05-08
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多