Нужна помощь в создании SQL-запроса с объединением и где на многих, чтобы многие отношения

0

У меня есть два объекта, которые связаны между собой многими отношениями. Эти два объекта: 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.

Похоже, я не могу сделать подзапрос?

  • 0
    Поможет ли ответ отсюда? stackoverflow.com/questions/10261945/...
  • 0
    Это помогло немного спасибо! Тем не менее, я не мог получить ответы на все вопросы.
Теги:

1 ответ

1
Лучший ответ

Функция 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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню