php - Symfony 3多对多不将数据保存到ManyToMany表

标签 php mysql symfony doctrine symfony-3.1

我使用预定义的数据库结构启动了项目,并使用控制台命令从数据库结构生成了实体。我正在创建巴士公司。巴士可以有许多设施(即许多巴士可以有许多设施)。

我有一个 ManyToMany 表,由于某种原因,该表内的数据未保存。其他表单数据保存在其他表中,但此表仍然为空。

有人知道问题出在哪里吗?

这是代码:

BusVehicles.php

     /**
         * Many Buses have Many Amenities.
         * @ORM\ManyToMany(targetEntity="BusVehicles", mappedBy="bus_amenities")
         * @ORM\JoinTable(
         *  name="bus_amenities",
         *  joinColumns={
         *      @ORM\JoinColumn(name="bus_id", referencedColumnName="id")
         *  },
         *  inverseJoinColumns={
         *      @ORM\JoinColumn(name="amenities_id", referencedColumnName="id")
         *  }
         * )
         */
        private $amenities;
    /**
     * Add items
     *
     * @param \AdminBundle\Entity\Amenities $amenities
     */

    public function addAmenities(Amenities $amenities)
    {
        if ($this->amenities->contains($amenities)) {
            return;
        }
        $this->amenities->add($amenities);
        $amenities->addBusAmenities($this);
    }

    /**
     * Remove amenities
     *
     * @param \AdminBundle\Entity\Amenities $amenities
     */
    public function removeAmenities(Amenities $amenities)
    {
        if (!$this->amenities->contains($amenities)) {
            return;
        }
        $this->amenities->removeElement($amenities);
        $amenities->removeBusAmenities($this);
    }

    /**
     * Get Amenities
     *
     * @return ArrayCollection
     */

    public function getAmenities()
    {
        return $this->amenities;
    }


    // ...

    public function __construct() {
        $this->amenities = new ArrayCollection();
    }
} 

设施.php

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="BusVehicles", mappedBy="amenities")
     */
    private $bus_amenities;

    public function __construct() {
        $this->bus_amenities = new ArrayCollection();
    }
    /**
     * Get bus amenities
     *
     * @return ArrayCollection
     */

    public function getBusAmenities()
    {
        return $this->bus_amenities;
    }



    /**
     * Add bus amenities
     *
     * @param \AdminBundle\Entity\BusVehicles
     */

    public function addBusAmenities(BusVehicles $amenities)
    {

        if ($this->bus_amenities->contains($amenities)) {
            return;
        }
        $this->bus_amenities->add($amenities);
        $amenities->addAmenities($this);


    }

    /**
     * Remove bus amenities
     *
     * @param \AdminBundle\Entity\BusVehicles
     */
    public function removeBusAmenities(BusVehicles $amenities)
    {

        if (!$this->bus_amenities->contains($amenities)) {
            return;
        }
        $this->bus_amenities->removeElement($amenities);
        $amenities->removeAmenities($this);
    }

Controller :

class BusController extends Controller
{
    /**
     * @Template
     */
    public function addAction(Request $request)
    {
        $bus = new BusVehicles();
        $form = $this->createForm(BusVehiclesType::class, $bus);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
           /* $amenities = $em->getAmenities();
            foreach($amenities as $amenitie){
                $em->persist($amenitie);
            }*/
            $em->persist($bus);

            $em->flush();

            // Adding flash message to our user

            $request->getSession()
                ->getFlashBag()
                ->add('success', 'New vehicle successfully added');


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

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


}

编辑1:添加表单

class BusVehiclesType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('licencePlate')
            ->add('manufacturer')         
            ->add('company', EntityType::class, array(
                'class' => 'AdminBundle:Companies',
                'choice_label' => 'name',
            ))
            ->add('busType', EntityType::class, array(
                'class' => 'AdminBundle:BusTypes',
                'choice_label' => 'type',
            ))
            ->add('emissionClass', EntityType::class, array(
                'class' => 'AdminBundle:BusEmissionClasses',
                'choice_label' => 'name',
            ))
            ->add('fuelType', EntityType::class, array(
                'class' => 'AdminBundle:BusFuelTypes',
                'choice_label' => 'fuel_type',
            ))
            ->add('amenities', EntityType::class, array(
                'class' => 'AdminBundle:Amenities',
                'choice_label' => 'name',
                'multiple' => true,
            ));
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AdminBundle\Entity\BusVehicles'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'adminbundle_busvehicles';
    }


}

最佳答案

我认为问题出在您的BusVehicles.php中,检查关系并按如下所示进行更改:

/**
     * Many Buses have Many Amenities.
     * @ORM\ManyToMany(targetEntity="Amenities", inversedBy="bus_amenities", cascade={"persist"})
     * 
     */
    private $amenities;

在 Aminities 实体中进行如下更改:

/**
 * @var ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="BusVehicles", mappedBy="amenities", cascade={"persist"})
 */
private $bus_amenities;

关于php - Symfony 3多对多不将数据保存到ManyToMany表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42995175/

相关文章:

mysql - SQL 将 a 引用到 b,将 b 引用到 a

mysql - 使用 mysql 根据每个客户的日期将第一条记录与其他行进行比较

php - Symfony DOMCrawler 打破每一个

symfony - jwplayer 6 无法使用 Symfony 找到 jwplayer.flash.swf

javascript - 如何在同一页面弹出成功信息

php - Laravel 5 空 cookie 崩溃

php - IIS 上的 Wordpress - 所有页面均返回服务器错误 500 "blank"页面

php - 脚本调用后 Bash 不继续?

java - infinispan 服务器上的 JDBC_PING 不工作

php - Symfony 2 'The process has been signaled with signal 5' 在使用 wkhtmltopdf 和 knpsnappy 时