Учение многие ко многим выбирают
Я читаю документацию Symfony
а также Doctrine
Однако я до сих пор не смог решить эту проблему.
Я работаю с Symfony2
, Объекты правильно настроены.
У меня есть две таблицы для данных: студенты, группы
У меня тоже есть таблица сопоставления: Students_group
Допустим, у меня есть пять групп: g1,g2,g3,g4,g5
Я хочу выбрать всех студентов из g1, g2, g3
Как я могу это сделать?
В настоящее время у меня есть этот код
public function filtered($array) {
/* GET DOCTRINE */
$repository = $this->getDoctrine()->getRepository('AppBundle:StudyGroups');
$query = $repository->createQueryBuilder('a')
->andWhere('a.id IN (:ids)')
->setParameter('ids', $array)
->getQuery();
$groups = $query->getResult();
$students = $groups->getStudents();
return $students;
}
Это не работает, так как нет метода getStudents() для групп. Но если я сделаю что-то подобное
public function filtered($array) {
/* GET DOCTRINE */
$repository = $this->getDoctrine()->getRepository('AppBundle:StudyGroups');
$query = $repository->createQueryBuilder('a')
->andWhere('a.id IN (:ids)')
->setParameter('ids', $array)
->getQuery();
$groups = $query->getResult();
$students = array();
foreach ($groups as $group) {
$students = $group->getStudents();
}
return $students;
}
Это работает, но есть проблема: я просто получаю студентов из последнего цикла foreach. Я думал о создании массива, но это объекты и слияние не работает. Честно говоря, я думаю, что есть более простой метод, чем этот, я просто не мог его найти. Любая идея?
1 ответ
Так как вы хотите, чтобы студенты, то вы должны запросить от студентов, присоединиться к группам и фильтровать для конкретных групп. Что-то вроде:
$repository = $this->getDoctrine()->getRepository('AppBundle:Student');
$query = $repository->createQueryBuilder('student')
->leftJoin('student.groups','group')
->andWhere('group.id IN (:ids)')
->setParameter('ids', $groupIds)
->getQuery();
$students = $query->getResult();
Кстати, использование отдельных букв в качестве псевдонимов является злой, злой, злой практикой.