4

この SQL を DQL またはクエリ ビルダーのバリアントがどのように見えるかに変換しようとしています。

select *
  from project_release r
 where (select s.title as status_name
          from release_status_log l
          left join release_status s
            on l.release_status_id = s.id
         where l.release_id = r.id
         order by l.created_at desc
         limit 1
       ) not in ('Complete', 'Closed')
;

エンティティのリポジトリクラス内からRelease、これを試しました

return $this->getEntityManager()->createQuery("
    select r.*
      from MyBundle:Release r
     where (select s.title
              from MyBundle:ReleaseStatusLog l
              join l.status s
             where l.release = r
             order by l.createdAt desc
             limit 1
           ) IN ('Complete','Closed')
     order by r.release_date ASC
     limit 10
")->getArrayResult();

エラーが発生する

[構文エラー] 行 0、列 265: エラー: 予想される Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS、get 'limit'

これはlimit 1、サブクエリで参照しています。

それで、私はこれを試しました

return $this
  ->createQueryBuilder('r')
  ->select('r.*')
  ->where("(select s.title
              from MyBundle:ReleaseStatusLog l
              join l.status s
             where l.release = r
             order by l.created_at desc
             limit 1
           ) $inClause ('Complete', 'Closed')
  ")
  ->setMaxResults( $limit )
  ->orderBy('release_date', 'ASC')
  ->getQuery()
  ->getArrayResult()
;

同じエラーが発生します。親クエリの行ごとに 1 行に制限されたサブクエリを実行するにはどうすればよいですか?

  • シンフォニー 2.0.15
  • 教義 2.1.7
  • PHP 5.3.3
  • MySQL 5.1.52
4

2 に答える 2

0

ネイティブ SQL ソリューションに加えて、単一のリポジトリ メソッド内で DQL を使用して 2 つのクエリを作成できます。

多少の調整が必要になる場合がありますが、これを試すことができます。

public function findCompletedReleases()
{
    $em = $this->getEntityManager();

    $dqlSubQuery = <<<SQL
SELECT
  s.title status_name
FROM
  Acme\MyBundle\Entity\ReleaseStatus s,
  Acme\MyBundle\Entity\ReleaseStatusLog l,
  Acme\MyBundle\Entity\Release r
WHERE
  l.release = r.id AND
  l.status  = s.id
ORDER BY l.createdAt DESC
SQL;

    $statusName = $em->createQuery($dqlSubQuery)
        ->setMaxResults(1)
        ->getSingleScalarResult();

    $dql = <<<SQL
SELECT
  r
FROM
  Acme\MyBundle\Entity\Release r
WHERE
  :status_name IN ('Complete','Closed')
ORDER BY r.release_date ASC
SQL;

    $q = $em->createQuery($dql)
        ->setParameters(array('status_name' => $statusName))
        ->setMaxResults(10);

    return $q->getArrayResult();
}
于 2013-06-12T18:44:31.217 に答える