У меня ниже отношения между моими сущностями.
Один из многих между 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 \ InstitutesBundle \ Entity \ InstitutesCourses». Вы имели в виду называть «getCourse» или «setCourse»?
Вы пытаетесь смешивать два разных подхода. Во-первых: сделать много разных отношений между институтами и курсами. Создать форму для институтов Entity, где проводятся курсы. В этом подходе доктрина создает записи в таблице InstitutesCourses для каждого курса самостоятельно. Второе: вы создаете форму для InstitutesCourses Entity. Одна форма – одна сущность. В этом случае вы должны использовать одно из решений для работы. Один из них: 1. В Форме Type введите «курсы» как не отображаемое поле («сопоставлено» = false). 2. После отправки формы получите массив «курсов» в контроллере
$courses=$form->get('courses')->getData();
Сделайте цикл для каждого курса в курсах с созданием InstitutesCourses вручную так:
foreach ($ courses as $ course) {$ institutesCourse = new InstitutesCourses (); $ institutesCourse-> setCourse ($ course) -> setInstitutes ($ институт); $ Эм -> $ сохраняются ($ institutesCourse); } $ em-> flush ();