Doctrineでは、2つの方法でDQLを作成できます。
EntityManager :: createQuery:
$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1');
QueryBuilder:
$qb->add('select', 'u')
->add('from', 'User u')
->add('where', 'u.id = ?1')
->add('orderBy', 'u.name ASC');
違いは何で、どちらを使用すればよいのでしょうか?
DQLはSQLに非常に似ているため、読みやすくなっています。パラメータのセットに応じてクエリを変更する必要がない場合、これがおそらく最良の選択です。
クエリビルダーは、クエリを構築するためのAPIであるため、一連のパラメーターやフィルターを反復処理するようにクエリを動的に構築する必要がある場合は簡単です。クエリを作成するために、join、splitなどの文字列操作を行う必要はありません。
クエリビルダは、クエリを作成するためのインターフェイスです。使用するのがより快適である必要があります。add()メソッドだけでなく、where()、andWhere()、from()などのメソッドもあります。しかし、最終的には、createQuery()メソッドで使用するようなクエリを作成します。
クエリビルダーのより高度な使用例:
$em->createQueryBuilder()
->from('Project\Entities\Item', 'i')
->select("i, e")
->join("i.entity", 'e')
->where("i.lang = :lang AND e.album = :album")
->setParameter('lang', $lang)
->setParameter('album', $album);
それらには異なる目的があります。
主な違いは、メソッド呼び出しのオーバーヘッドです。最初のコードサンプル(createQuery)は、単純にするために1つのメソッド呼び出しを行い、queryBuilderは4を呼び出します。もう1つは、複数のチェーンされたメソッド呼び出しでビルドしています。
どちらか一方を使用する理由を探している場合、それはスタイルの問題であり、より読みやすいものです。私にとって、私はほとんどの場合queryBuiderが好きで、クエリに対して明確に定義されたセクションを提供します。また、過去には、必要なときに条件付きロジックを簡単に追加できました。
クエリビルダーを使用すると、単体テストが簡単になる場合があります。複雑な条件のリストに基づいてデータを照会するリポジトリがあるとします。また、特定の条件がリポジトリに渡された場合、他の条件がクエリに追加されることを保証したいとします。 DQLの場合、2つのオプションがあります。
1)フィクスチャを使用し、DBとの実際の相互作用をテストする。それはやや面倒で統一されていないことがわかります。
2)生成されたDQLコードを確認します。これにより、テストが非常に脆弱になります。
QueryBuilderを使用すると、モックで置き換えることができ、必要なパラメーターを持つ「andWhere」メソッドが呼び出されることを確認できます。もちろん、クエリが単純でパラメーターに依存していない場合、このような考慮事項は適用されません。