需要帮助构建带有join的sql查询以及多对多的关系

时间:2014-11-16 22:41:00

标签: mysql sql symfony

我有两个由多对多关系相关的对象。这两个对象是VideoCategory。视频可以有许多类别,反之亦然。我想要做的是,如果我有一个类别,则检索所有具有此类别的视频。另外,我有一个Section对象,它与Video有一个OneMoMany关系,这是一个包含很多视频的部分。我现在要做的是以下内容:

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.

看起来我不能制作子查询?

1 个答案:

答案 0 :(得分:1)

Doctrine IN函数需要在(1, 2, 3, 4, ...)语句之后使用IN格式。不幸的是,它不适用于列条件来证明成员资格。

但是,我相信您正在寻找MEMBER OF主义功能:

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();