我有两个与多对多关系相关的对象。这两个对象是Video和Category。视频可以有很多类别,反之亦然。我想做的是,如果我有一个类别,则检索具有该类别的所有视频。另外,我还有一个Section对象,该对象与Video具有oneToMany关系,该部分包含许多视频。我现在想做的是以下内容:
Video
Category
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.
看来我无法进行子查询?
教义IN函数期望(1, 2, 3, 4, ...)afterIN语句的格式。不幸的是,这并不意味着列条件证明成员身份。
IN
(1, 2, 3, 4, ...)
但是,我相信您正在寻找“MEMBER OF教义”功能:
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使用此功能的对象。
$category
该示例隐藏在Doctrine文档的深处:
$query = $em->createQuery('SELECT u.id FROM CmsUser u WHERE :groupId MEMBER OF u.groups'); $query->setParameter('groupId', $group); $ids = $query->getResult();