У меня ниже отношения между моими сущностями.
Один из многих между 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 ($ институт); $em-> $ сохраняются ($ institutesCourse); } $em-> flush();
InstitutesCourses
. Это изменило бы значение отношения. Если поле относится к одному курсу и одному институту или нет.