Учение многие ко многим выбирают

Я читаю документацию 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();

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

Другие вопросы по тегам