Symfony Назначение нескольких значений одновременно в форме сущности моста

1

У меня ниже отношения между моими сущностями.

Один из многих между InstituteInstituteCourses. От одного до многих между CoursesInstituteCourses.

Я избегал делать много разных между институтами и курсами, потому что у меня есть больше полей в инстимутатуре.

Пока это хорошо работает,

    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\InstitutesBundle\Entity\InstitutesCourses". Вы имели в виду называть "getCourse" или "setCourse"?

  • 0
    Можете ли вы добавить пример полей в InstitutesCourses . Это изменило бы значение отношения. Если поле относится к одному курсу и одному институту или нет.
  • 0
    @Kevinrob проверьте обновленный вопрос.
Теги:
jquery-select2
doctrine2

1 ответ

1

Вы пытаетесь смешивать два разных подхода. Во-первых: сделать много разных отношений между институтами и курсами. Создать форму для институтов Entity, где проводятся курсы. В этом подходе доктрина создает записи в таблице InstitutesCourses для каждого курса самостоятельно. Второе: вы создаете форму для InstitutesCourses Entity. Одна форма - одна сущность. В этом случае вы должны использовать одно из решений для работы. Один из них: 1. В Форме Type введите "курсы" как не отображаемое поле ("сопоставлено" = false). 2. После отправки формы получите массив "курсов" в контроллере

$courses=$form->get('courses')->getData();
  1. Сделайте цикл для каждого курса в курсах с созданием InstitutesCourses вручную так:

    foreach ($ courses as $ course) {$ institutesCourse = new InstitutesCourses(); $institutesCourse-> setCourse ($ course) → setInstitutes ($ институт); $em-> $ сохраняются ($ institutesCourse); } $em-> flush();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню