Doctrine クエリ言語: グループごとの最大または最新の行の検索
一部のデータベース操作では、最大または最新の行をクエリする必要があります。データのグループ内の行。このような操作を実行する SQL ステートメントを Doctrine Query Language (DQL) に変換するには、特定の手法を活用する必要があります。
一般的な SQL 手法の 1 つは、サブクエリを使用してグループ内の最高値または最新値を特定し、結合することです。それらの結果を含むメインクエリ。ただし、Doctrine に関しては、このアプローチは複雑になる可能性があります。
別の解決策は、集計関数の使用を避けるために SQL ステートメントを書き直すことです。たとえば、名前ごとの最高スコアを見つけるには、次の SQL ステートメントを使用できます。
SELECT a.* FROM score a LEFT JOIN score b ON a.name = b.name AND a.score < b.score WHERE b.score IS NULL ORDER BY a.score DESC
このクエリは、スコア テーブルから、同じ名前でより高いスコアが記録されていないすべての行を選択します。
SQL ステートメントを DQL に変換するには、次のように記述できます。
SELECT a FROM AppBundle\Entity\Score a LEFT JOIN AppBundle\Entity\Score b WITH a.name = b.name AND a.score < b.score WHERE b.score IS NULL ORDER BY a.score DESC
Doctrine のクエリ ビルダー API を使用することもできます。クエリを構築するには:
$DM = $this->get( 'Doctrine' )->getManager(); $repo = $DM->getRepository( 'AppBundle\Entity\Score' ); $results = $repo->createQueryBuilder( 'a' ) ->select( 'a' ) ->leftJoin( 'AppBundle\Entity\Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score' ) ->where( 'b.score IS NULL' ) ->orderBy( 'a.score','DESC' ) ->getQuery() ->getResult();
これは、Doctrine を使用して元の SQL ステートメントと同じ操作を実行する効率的な方法を提供します。
以上がDoctrine クエリ言語を使用してグループごとの最大行または最新行を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。