Symfony在桥接实体窗体中同时分配多个值


Symfony Assign multiple values at once in Bridge Entity Form

我的实体之间有以下关系。

Institute->InstituteCourses之间的一对多。Courses->InstituteCourses之间的一对多。

我避免在学院和课程之间进行多对多,因为我在学院实体中有更多的领域。

目前它运行良好,

    class Institutes {
        /**
        * @ORM'OneToMany(targetEntity="InstitutesCourses", mappedBy="institute", cascade={"all"})
        **/
        protected $instituteCourses;
    }
    class Courses {
        /**
         *
         * @ORM'OneToMany(targetEntity="InstitutesCourses", mappedBy="course", cascade={"all"}, orphanRemoval=true)
         */
        protected $instituteCourses;
    }
    class InstitutesCourses {
        /**
         * @ORM'ManyToOne(targetEntity="Institutes", inversedBy="instituteCourses")
         * @ORM'JoinColumn(name="institute_id", referencedColumnName="id")
         */
        protected $institute;
        /**
         * @ORM'ManyToOne(targetEntity="Courses", inversedBy="instituteCourses")
         * @ORM'JoinColumn(name="course_id", referencedColumnName="id")
         */
        protected $course;
  /**
     * @var boolean $isPrimary
     * @ORM'Column(name="is_primary", type="boolean", nullable=true)
     */
    protected $isPrimary;
   /**
     * @var boolean $verified
     * @ORM'Column(name="courses_verified", type="boolean", nullable=true)
     */
    protected $verified;
    /**
     * @var boolean $active
     * @ORM'Column(name="courses_active", type="boolean", nullable=true)
     */
    protected $active;
    /**
     *
     * @ORM'OneToMany(targetEntity="AcademicSessions", mappedBy="instituteCourse")
     */
    protected $academicSession;
    }

形式是

 $builder->add('institute','entity', array(
                    'class'=>'PNC'InstitutesBundle'Entity'Institutes',
                    'property'=>'name',
                    'label' => 'Institute'
                )
            )
            ->add('course', 'entity', array(
                'class' => 'PNC'CoursesBundle'Entity'Courses',
                'property' => 'courseTitle',
                //'multiple' => true,
                'attr' => array(
                    'class' => 'form-control'
                )
            ))

现在,如果我想分配一个学院多门课程,我必须多次参加所有新的活动,我想在一次提交分配给一个学院的多门课程。当我在表单中的课程字段中设置multiple=true时,会出现错误。

更新-

class Institutes {
  /**
     * @ORM'OneToMany(targetEntity="NC'InstitutesBundle'Entity'InstitutesCourses", mappedBy="institute", cascade={"all"})
     * */
    protected $inst;
    protected $courses;

 public function __construct()
    {
        $this->inst = new ArrayCollection();
        $this->courses = new ArrayCollection();
    }
    // Important
    public function getCourses()
    {
        $courses = new ArrayCollection();
        foreach($this->inst as $ins)
        {
            $courses[] = $ins->getCourses();
        }
        return $courses;
    }
    // Important
    public function setCourses($courses)
    {

        foreach($courses as $c)
        {
            $po = new InstitutesCourses();
            $po->setCourse($c);
            $po->setInstitute($this);
            $this->addInst($po);
        }
    }
    // Important
    public function getCourse()
    {
        return $this;
    }
    // Important
    public function addInst($InstitutesCourses)
    {
        $this->inst[] = $InstitutesCourses;
    }
    // Important
    public function removeIns($InstitutesCourses)
    {
        return $this->inst->removeElement($InstitutesCourses);
    }

}和

class Courses {
    /**
     *
     * @ORM'OneToMany(targetEntity="NC'InstitutesBundle'Entity'InstitutesCourses", mappedBy="course", cascade={"all"}, orphanRemoval=true)
     */
    protected $instituteCourses;
    /**
     * @return mixed
     */
    public function getInstituteCourses()
    {
        return $this->instituteCourses;
    }
    /**
     * @param mixed $instituteCourses
     */
    public function setInstituteCourses($instituteCourses)
    {
        $this->instituteCourses = $instituteCourses;
    }
}

以及桥接实体。

class InstitutesCourses {
/**
     * @ORM'ManyToOne(targetEntity="PNC'InstitutesBundle'Entity'Institutes", inversedBy="instituteCourses")
     * @ORM'JoinColumn(name="institute_id", referencedColumnName="id")
     */
    protected $institute;
    /**
     * @ORM'ManyToOne(targetEntity="PNC'CoursesBundle'Entity'Courses", inversedBy="instituteCourses")
     * @ORM'JoinColumn(name="course_id", referencedColumnName="id")
     */
    protected $course;
 /**
     * @return mixed
     */
    public function getInstitute()
    {
        return $this->institute;
    }
    /**
     * @param mixed $institute
     */
    public function setInstitute($institute)
    {
        $this->institute = $institute;
    }
    /**
     * @return mixed
     */
    public function getCourse()
    {
        return $this->course;
    }
    /**
     * @param mixed $course
     */
    public function setCourse( $course)
    {
        $this->course = $course;
    }
}

我制作了一个机构类型的表格,

->add('courses' , 'entity' , array(
'class'    => 'PNCCoursesBundle:Courses' ,
'property' => 'courseTitle' ,
//'expanded' => true ,
'multiple' => true ,
'attr'=> array(
      'class' => 'form-control',
),
'label_attr' => array(
'class' => 'control-label'
),
)

现在,当我去创建一个新的它完美地保存了记录,当我更新同一个记录时,它说。

尝试调用类的名为"getCourses"的未定义方法"NC''学院捆绑包''实体''学院课程"。你想打电话吗例如"getCourse"或"setCourse"?

您尝试混合使用两种不同的方法。第一:建立学院与课程的多对多关系。为机构实体创建表单,其中课程是集合。在这种方法中,学说在InstitutesCourses表中为自己的每门课程创建记录。第二:创建InstitutesCourses实体的表单。一个形式-一个实体。在这种情况下,您必须使用其中一个解决方案。其中之一:1.在表单类型中,将"课程"设置为未映射字段('mapped'=false)2.提交表格后,在控制器中获取"课程"数组

$courses=$form->get('courses')->getData();
  1. 通过创建InstitutesCourses手动为课程中的每门课程制作循环:

    foreach($courses作为$course){$institutesCourse=新学院课程();$institutesCourse->setCourse($course)->setInstitutes($institute);$em->$persistent($institutesCourse);}$em->flush();