73

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');

違いは何ですか、どちらを使用すればよいですか?

4

5 に答える 5

70
  1. DQL は SQL に非常に似ているため、読みやすくなっています。一連のパラメーターに応じてクエリを変更する必要がない場合、これがおそらく最良の選択です。

  2. Query Builder はクエリを構築するための API であるため、一連のパラメーターやフィルターを反復処理するなど、クエリを動的に構築する必要がある場合は簡単です。結合、分割などのクエリを作成するために文字列操作を行う必要はありません。

于 2010-12-09T00:23:49.403 に答える
34

クエリビルダーは、たとえば、クエリを作成するためのインターフェイスです...より快適に使用できるはずです.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);
于 2010-12-09T08:34:27.737 に答える
15

それらにはさまざまな目的があります。

  • 完全なクエリがわかっている場合は、DQL を使用する方が簡単です。
  • いくつかの条件、ループなどに基づいてクエリを作成する必要がある場合、クエリ ビルダーはよりスマートです。
于 2012-08-16T17:07:03.633 に答える
4

主な違いは、メソッド呼び出しのオーバーヘッドです。簡単にするための最初のコード サンプル (createQuery) では、1 つのメソッド呼び出しが行われますが、queryBuilder では 4 つのメソッド呼び出しが行われます。もう1つは、複数の連鎖メソッド呼び出しで構築しています。

どちらか一方を使用する理由を探している場合、それはスタイルの問題であり、何がより読みやすく見えるかです。私にとっては、ほとんどの場合、queryBuider が気に入っています。これは、クエリ用に明確に定義されたセクションを提供します。また、これまでは、必要なときに条件付きロジックを簡単に追加できました。

于 2014-06-05T18:28:56.747 に答える
1

クエリ ビルダーを使用すると、単体テストが簡単になる場合があります。複雑な条件のリストに基づいてデータを照会するリポジトリがあるとします。また、特定の条件がリポジトリに渡された場合に、他の条件がクエリに追加されるようにする必要があります。DQL の場合、次の 2 つのオプションがあります。

1) フィクスチャを使用し、DB との実際の相互作用をテストします。これはやや面倒でまとまりがないと思います。

2) 生成された DQL コードを確認します。これにより、テストが脆弱になりすぎる可能性があります。

QueryBuilder では、モックに置き換えて、必要なパラメーターを指定した「andWhere」メソッドが呼び出されることを確認できます。もちろん、クエリが単純でパラメータに依存しない場合、そのような考慮事項は適用されません。

于 2015-04-07T17:12:39.403 に答える