Я получил простое отношение m2m (book -> book_mark <- mark). Я хочу найти предмет (книгу) по 1-2-3 ... х-меток (меток). Пример: Book1 получил эти теги: [Mark1, Mark2, Mark3], Book2 получил эти теги: [Mark1, Mark3, Mark4]. Список поиска [Mark1, Mark2]. Я хочу найти только элементы, которые имеют ВСЕ теги из списка поиска, т.е. только Book1 в этом примере. </p>
Я пробовал много способов и провел много времени в Google, но не нашел ответа.
Самое близкое, что у меня есть, это:
return $this->createQueryBuilder('b')
->select('b, m')
->leftJoin('b.marks_list', 'm')
->andWhere(':marks_list MEMBER OF b.marks_list')
->setParameter('marks_list', $marksList)
->getQuery()->getArrayResult();
Но он ищет книги, у которых есть хотя бы 1 из параметров, а не все вместе
Затем я решил, что я абсолютно неправ, и начал думать так:
public function findAllByMarksList(array $marksList)
{
$qb = $this->createQueryBuilder('b')
->select('b, m')
->leftJoin('b.marks_list', 'm');
for ($i = 0; $i<count($marksList); $i++){
$qb->andWhere('m.id in (:mark'.$i.')')
->setParameter('mark'.$i, $marksList[$i]);
}
return $qb->getQuery()->getArrayResult();
}
Но здесь я столкнулся с другой проблемой: этот код проверяет только 1 отметку, а затем всегда возвращает пустой набор, если число параметров больше 1.
С наилучшими пожеланиями.