2016-04-30 12 views
3

DBALクエリビルダ: http://www.doctrine-project.org/api/dbal/2.3/class-Doctrine.DBAL.Query.QueryBuilder.htmlドクトリン:ORM QueryBuilderやDBAL QueryBuilder

ORMクエリビルダ: http://www.doctrine-project.org/api/orm/2.3/class-Doctrine.ORM.QueryBuilder.html

インサイド教義は非常に似ている2 QueryBuilder、DBAL 1およびORMのものがあります。

これらの2つの違いは何ですか? ORM queryBuilderをDBALと比較して大きなオーバヘッドがありますか?

(私は、動的ステートメントを使用する必要があるとして、ネイティブクエリは問題外です)

答えて

0

最初は、第二は、DQLのもののためで、SQLクエリのためです。

ほとんどの場合、EntityManager::createQueryBuilder()からQueryBuilderのインスタンスを取得するには、(多分リポジトリクラスを介して、EntityRepository;;createQueryBuilder()を参照)、この場合には、あなたはDoctrine\ORM\QueryBuilderを使用するので、DQLの設定を記述します。

SQLクエリを実行する必要がある場合は、Doctrine\DBAL\Connection::createQueryBuilder()からEntityManager::getConnection()に検索されることが多いDoctrine\DBAL\QueryBuilderインスタンスを使用します。

the benefits of use DQL over SQL in doctrine(およびその逆)について詳しく読むことができます。

3

ORMを使用する場合はORMを使用してください。それ以外の場合は、DBALを使用してください。以下に、あなたが実際に何をしているかについていくつかの詳細を見つけることができます。

DBALは、を表します。データベース抽象化レイヤ。ドライバやクエリ構文のようなデータベース特有のものを抽象化しようとするので、コードを変更することなくそれらを交換することができます。 オブジェクトリレーショナルマッピングの略

ORMは、これはさらにDBALより移行して、アプリケーション内の実際のクラスにデータベーススキーマをバインドしようとします。

これらの両方にはクエリビルダーが付属しています。 DBALクエリビルダは、複数のドライバ/データベースとの互換性のみを提供するため、より基本的です。あなたはまだテーブルを操作していますが、それでも結果として行が得られます。一方、ORM問合せビルダーは、エンティティ(データベース・スキーマがバインドされているクラス)を処理するように設計されています。例えば

、DBALクエリ:ここ

$builder->select('u.id, e.id, e.email') 
    ->from('users', 'u') 
    ->leftJoin('u', 'emails', 'e', 'u.id = e.user_id') 
    ->where('u.id = :id') 
    ->setParameter(':id', $id); 

$rows = $builder->execute()->fetchAll(); 

、我々はID $idで、ユーザーのすべての電子メールアドレスを取得するには、emailsテーブルでusersのテーブルを結合するクエリを作成します。結果は連想配列の形になります。今度は、ORMを見てみましょう。ここでは

$builder->select('u','e') 
    ->leftJoin('u.emails', 'e') 
    ->where('u.id = :id') 
    ->setParameter(':id', $id); 

$user = $builder->getQuery()->getOneOrNullResult(); 

を、我々は彼のEmail電子メールアドレスのすべてにID $idUserを取得したいと言います。彼らがどのような表から来ているのか、それとも何が関係しているのかは気にしません。あなたが得るものはEmailオブジェクトのコレクションを持つUserクラスのインスタンスです。ORMマッピングのおかげで、すべてが適切なデータで埋められました。