У меня есть два объекта, которые связаны между собой многими отношениями. Эти два объекта: Video
и Category
. Видео может иметь много категорий и наоборот. Что я хочу сделать, так это то, что если у меня есть категория, чтобы получить все видео, которые имеют эту категорию. Кроме того, у меня есть объект Section, у которого есть отношения OneToMany с Video, то есть раздел содержит много видео. Сейчас я пытаюсь сделать следующее:
public function findAllBySectionAndCategory($section, $category) {
$query = $this->getEntityManager()
->createQuery(
'SELECT v FROM OSCMySportBundle:Video v WHERE v.section = :section AND :category IN v.categories'
)
->setParameter('section', $section)
->setParameter('category', $category);
return $query->getResult();
}
Когда я пытаюсь проверить этот запрос, я получаю следующую ошибку:
[Syntax Error] line 0, col 83: Error: Expected Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS, got 'v'
Вероятно, это означает, что он ищет массив, но нашел v. Я знаю, что это, вероятно, простой вопрос, но я не могу понять.
Изменить 1:
Мне удалось изменить его следующим образом, чтобы я мог сделать JOIN:
'SELECT v FROM OSCMySportBundle:Video v JOIN v.categories category WHERE category.id = :category '
Однако мне также нужно запросить видео на основе раздела, поэтому я сделал следующее:
'SELECT v FROM (SELECT a FROM OSCMySportBundle:Video a WHERE a.section = :section) JOIN v.categories category WHERE category.id = :category '
Но получилась следующая ошибка:
[Semantical Error] line 0, col 14 near '(SELECT a FROM': Error: Class '(' is not defined.
Похоже, я не могу сделать подзапрос?
Функция Doctrine IN
ожидает формат (1, 2, 3, 4, ...)
после оператора IN
. К сожалению, это не означает, что условия столбца доказывают принадлежность.
Однако, я считаю, что вы ищете функцию MEMBER OF
Doctrine:
public function findAllBySectionAndCategory($section, $category) {
$query = $this->getEntityManager()
->createQuery(
'SELECT v FROM OSCMySportBundle:Video v WHERE v.section = :section AND :category MEMBER OF v.categories'
)
->setParameter('section', $section)
->setParameter('category', $category);
return $query->getResult();
}
С помощью этой функции вы можете передать действительный объект Doctrine или идентификатор в $category
.
Пример для этого скрыт глубоко в Doctrine docs:
$query = $em->createQuery('SELECT u.id FROM CmsUser u WHERE :groupId MEMBER OF u.groups');
$query->setParameter('groupId', $group);
$ids = $query->getResult();