3

作为我网站的一部分,我正在尝试使用 Symfony2 和 Doctrine2 创建标记(民间文学)系统。

我正在按照以下文档中的表格和查询示例来创建我的教义实体:http ://dablog.ulcc.ac.uk/wp-content/uploads/2007/12/tagging_folksonomy.pdf

当我尝试将 MySQL 查询(在文档中给出)转换为 Doctrine Query Builder 查询时,innerJoins 出现错误。下面的例子:

来自文档的 MySQL 查询:

SELECT tag_text
, COUNT(*) as num_tags
FROM Tag2Post t2p
INNER JOIN Tags t
ON t2p.tag_id = t.tag_id
GROUP BY tag_text;

我的教义查询生成器查询:

$qb = $em->createQueryBuilder()
          ->select('t.tag_text, COUNT(*) as num_tags')
          ->from('CompanyWebsiteBundle:Tag2Post', 't2p')
          ->innerJoin('CompanyWebsiteBundle:Tags', 't', 'ON', 't2p.tag_id = t.id')
          ->groupBy('t.tag_text')
;
$tags = $qb->getQuery()->getResult();

错误信息:

[2/2] QueryException: [Syntax Error] line 0, col 112: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'
[1/2] QueryException: SELECT t.tag_text, COUNT(*) as num_tags FROM CompanyWebsiteBundle:Tag2Post t2p INNER JOIN CompanyWebsiteBundle:Tag t ON t2p.tag_id = t.id GROUP BY t.tag_text

当我直接在数据库上运行 MySQL 查询时,它可以工作!

4

1 回答 1

10

这应该有效。在 DQL 中,ON关键字被替换为WITH.

$qb = $em->createQueryBuilder()
      ->select('t.tag_text, COUNT(*) as num_tags')
      ->from('CompanyWebsiteBundle:Tag2Post', 't2p')
      ->innerJoin('CompanyWebsiteBundle:Tags', 't', 'WITH', 't2p.tag_id = t.id')
      ->groupBy('t.tag_text')
;
$tags = $qb->getQuery()->getResult();

此外,如果您已正确配置实体,您应该能够省略该, 'WITH', 't2p.tag_id = t.id'部分,因为学说应该自动找到关系。

例如:

$qb = $em->createQueryBuilder()
      ->select('t.tag_text, COUNT(*) as num_tags')
      ->from('CompanyWebsiteBundle:Tag2Post', 't2p')
      ->innerJoin('t2p.tags', 't')
      ->groupBy('t.tag_text')
;
$tags = $qb->getQuery()->getResult();
于 2012-08-22T11:03:36.733 回答