У меня проблема с ассоциацией ManyToMany. Я не могу понять, как получить данные из базы данных. У меня 2 сущности - Учитель и Предмет.
Тема класса
/**
*
* @ORM\ManyToMany(targetEntity = "Teacher", mappedBy = "subjects")
*/
private $teachers;
public function __construct() {
$this->teachers = new ArrayCollection();
}
/**
* Add teacher
*
* @param \AppBundle\Entity\Teacher $teacher
*
* @return Subject
*/
public function addTeacher(\AppBundle\Entity\Teacher $teacher)
{
$this->teachers[] = $teacher;
return $this;
}
/**
* Remove teacher
*
* @param \AppBundle\Entity\Teacher $teacher
*/
public function removeTeacher(\AppBundle\Entity\Teacher $teacher)
{
$this->teachers->removeElement($teacher);
}
/**
* Get teachers
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTeachers()
{
return $this->teachers;
}
И Учитель сущностей
Классный руководитель
/**
*
* @ORM\ManyToMany(targetEntity = "Subject", inversedBy = "teachers")
*/
private $subjects;
public function __construct()
{
$this->subjects = new ArrayCollection();
}
/**
* Add subject
*
* @param \AppBundle\Entity\Subject $subject
*
* @return Teacher
*/
public function addSubject(\AppBundle\Entity\Subject $subject)
{
$this->subjects[] = $subject;
return $this;
}
/**
* Remove subject
*
* @param \AppBundle\Entity\Subject $subject
*/
public function removeSubject(\AppBundle\Entity\Subject $subject)
{
$this->subjects->removeElement($subject);
}
/**
* Get subjects
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getSubjects()
{
return $this->subjects;
}
Все, что я хочу сделать, это получить всю информацию от Учителя + Предметы, связанные с ними.
Как должен выглядеть мой контроллер для этого?
Я пытаюсь сделать это
$teacher = $this->getDoctrine()->getRepository(Teacher::class)->findAll();
return $this->render('admin/adminDashboard.html.twig', [
'teachers' => $teacher]);
Но у меня все еще есть ошибки
Я помещаю учителя в цикл foreach, где я ссылаюсь на метод getSubjects (например, @ domagoj03 посоветовал мне), а в Twig я сбрасываю (учитель), когда я это делаю, у меня больше нет ошибок, но ArrayCollection of Subjects пуст i.imgur.com/mptIJ79.jpg И я уверен у меня есть какая-то ассоциация в моей таблице Teacher_Subject
И ошибка, которую я получил, когда пытаюсь отрендерить храм с помощью {{teacher.subjects}}: «Во время рендеринга шаблона возникло исключение (« Catchable Fatal Error: объект класса Doctrine \ ORM \ PersistentCollection не может быть преобразован. нанизывать").
предполагая, что вы изменили имя $teacher на $teachers, передайте его в свой шаблон и попробуйте этот {% for t in teachers %}{{dump(t.subjects.count)}}{% endfor %}. который должен напечатать строку для каждого учителя с количеством предметов в каждом
Ага, работает. Как вы сказали, у меня есть три строки (у меня 3 учителя в db), и в каждой строке у меня есть номер 1 (у меня есть 3 предмета, каждый из которых связан с каждым учителем)
Но у меня все еще есть проблема с его получением без дампа ()




Во-первых, я советую изменить вашу переменную $ учитель на $ учителя как Метод findAll () возвращает массив, поэтому вам нужно перебирать его. В вашем контроллере:
foreach($teachers as $teacher) { // Here you have $teacher and you can do $teacher->getSubjects() }
В вашем шаблоне веточки:
{% for teacher in teachers %}
{{ dump(teacher) }}
{% endfor %}
Если это не сработает, сообщите нам, какие у вас ошибки. Все это при условии, что у вас есть записи внутри вашей базы данных или откуда бы вы ни извлекали свои объекты.
Это может означать, что либо у вас нет записей по предметам, связанным с упомянутой группой учителей, либо что-то не так с вашими ассоциациями. Без дополнительных подсказок я ничем не могу помочь, кроме этого.
если {% for t in teachers %}{{dump(t.subjects.count)}}{% endfor %} сработал, значит данные есть.
Если вы имеете в виду {{teacher.subjects}}, выдает ошибку: Возникло исключение во время рендеринга шаблона («Catchable Fatal Error: объект класса Doctrine \ ORM \ PersistentCollection не может быть преобразован в строку.. Что ж, если вы никогда раньше не видели эту ошибку, внимательно прочтите:
Объект класса Doctrine \ ORM \ PersistentCollection относится к subjects, который как коллекцию не может быть просто вставлен в тег html как строку.
Зависит от того, как вы хотите представить свои данные, но самые основы будут следующими:
{% for t in teachers %}
<tr>
{% for s in t.subjects %}
<td>s.getName</td>
{% endfor %}
</tr>
{% endfor %}
предполагая, что объект subject имеет свойство name и получатель для него. Надеюсь, вы уловили суть.
дай мне знать
Наконец-то работает! Большое спасибо за помощь и уделенное время!
@ miguelsantos69 в любое время!
какие ошибки вы получаете?