2011-07-22 8 views
10

私はお互いに関連する9つのエンティティを持つ部屋予約システムを設計しています。この特定の例では、25のプロパティを持つentryエンティティから10-30行を取得しています。各エントリには、1つのroomというプロパティがあります。私はentry->room->identry->room->nameだけでなく、すべてのエントリ情報が必要です。しかし、私がQuery::HYDRATE_ARRAYを使用すると、教義がroom全体を読み込んでいるようです。 Query::HYDRATE_OBJECTの方が簡単に遅延ロードされているようです。Doctrine2 ...ベストハイドレーションモード?

Query::HYDRATE_OBJECTモードを使用すると、より速くまたは「より良い」Query::HYDRATE_ARRAY/Query::HYDRATE_SCALAR/Query::HYDRATE_SINGLE_SCALAR超える場合だから、私は疑問に思って。以前のコードを再利用しているので、アプリケーションを遅くすることがない場合にのみ、HYDRATE_ARRAYを使用したいと思います。

答えて

13

私の2セント:

HYDRATE_OBJECTはあなたのオブジェクトとビジネスロジックの多くを使用する予定のときに最適です。特にデータ操作をたくさんしている場合は特にそうです。それはおそらく最も遅い(状況に応じて)。

HYDRATE_ARRAYは、通常、結果と1度の関係データのみが必要な場合に予約されており、印刷/閲覧目的でのみ使用されます。

HYDRATE_NONEは、データ全体(行全体の代わりに1つまたは2つのフィールドなど)を選択するときに使用するもう1つの方法です。これは、未処理のクエリ結果と同じように動作します。

これはまた、関心http://www.doctrine-project.org/2010/03/17/doctrine-performance-revisited.html

これは1.2のドキュメントからのものであるかもしれないが、私は水和のヒントが2.0 http://doctrine.readthedocs.org/en/latest/en/manual/improving-performance.html

であるこのカテゴリに属しているもう一つの重要なルールを適用すると思う:オブジェクトだけを取り出しますあなたが本当にそれらを必要とするとき。 Doctrineには、オブジェクトグラフの代わりに「配列グラフ」を取得する機能があります。一見、これは奇妙に聞こえるかもしれません、なぜ最初にオブジェクトリレーショナルマッパーを使用するのでしょうか?それについて考えてみましょう。 PHPは本質的に、適切なOOPのための多くの機能が強化された先行言語です。配列は依然としてPHPで使用できる最も効率的なデータ構造です。オブジェクトは、複雑なビジネスロジックを達成するために使用されるときに最も価値があります。

あなたが代わりの観点持つオブジェクトのいずれかの利益を考えることができます:あなたはHYDRATE_ARRAYを使用して上の

のない利点を持っていないときにデータが高価なオブジェクト構造に包ま取得した時点で、リソースの無駄ですアレイ?ビューでビジネスロジックを実行するつもりはありませんか?

$blogPosts = $q->execute(array(1), Doctrine_Core::HYDRATE_ARRAY); 
+0

これは本当に便利です:1つのパラメータはあなたに不要な処理を大幅に節約することができます!本当にありがとう! – Daniel

+0

ちょうどメモ。 'HYDRATE NONE'は存在しないようです... 1.2からですか?代わりに 'HYDRATE_SCALAR'と' HYDRATE_SINGLE_SCALAR'を使用しています。 – Daniel

+0

@ダニエルあなたはおそらく正しいでしょう。私は1.2を使用しましたが、 'SCALAR'メソッドは' HYDRATE_NONE'と同じ利点をもたらすように見えます。 –