3

私のウェブサイトの一部として、Symfony2 と Doctrine2 を使用してタグ付け (フォークソノミー) システムを作成しようとしています。

Doctrine Entitiesを作成するために、以下のドキュメントのテーブルとクエリの例に従っています。

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;

私の Doctrine Query Builder クエリ:

$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 に答える