2

私はこの基本的なモデルを持っています:

ここに画像の説明を入力してください

テーブルからエントリをフェッチしbookて出力をダンプすると、次のようになります。

// no other Doctrine queries were made before this one:
$book = $em->getRepository('Entities\Book')->find(1);
var_dump($book);

私はBookエンティティを取得しますが、プロキシされたエンティティも取得しますAuthor

object(Entities\Book)#179 (3) {
  ["id":"Entities\Book":private]=>
  int(1)
  ["title":"Entities\Book":private]=>
  string(7) "MyBook1"
  ["author":"Entities\Book":private]=>
  object(Doctrine\Proxy\__CG__\Entities\Author)#171 (5) {
  [...]  // many more lines of output

私の理解では、のプロキシエンティティAuthorが期待されます。これは、実行時にテーブルから情報を遅延ロードする方法Doctrineだからです。author$book->getAuthor()

Q1:この段階で、プロキシされた作成者エンティティの存在が予想されることを確認しますか?

しかし、私が驚いたのは、var_dump出力(私があなたが見るためにpastebinにアップロードした)を見ると、それは行以上のものを含んでいるということ10,000です!私が見つけることを期待していなかったものには、モデルへの参照dummy_table1や、モデルにdummy_table2関連していない、bookまたはauthorモデル内にないものが含まれます。

["dummy_table1"]=>    // line 1301
object(Doctrine\DBAL\Schema\Table)#194 (10) {

["dummy_table2"]=>   // line 1384
object(Doctrine\DBAL\Schema\Table)#191 (10) {

Q2:それも期待されていますか?

そこから私は疑問に思っていました:$bookキャッシュに含まれている情報を保存しserializeて、後でビューで再利用したい場合(いくつかの操作を実行することについて話しているのではなく$book、いくつかのプロパティを出力するだけです)、私が本のタイトルのために保存するのと同じように正気500KBではありません、それは私をこの最後の質問に連れて行きます:

Q3:Doctrineクエリの結果をどのようにキャッシュしますか?エンティティ全体をキャッシュにシリアル化し、必要な情報を配列に抽出して、その配列をキャッシュに保存しますか?そうであれば、すぐに面倒になりませんか...?

4

1 に答える 1

1

A1:エンティティの関係はいつでも存在します(遅延読み込みのアイデアが得られると書いています)。関係は、それが要求されたときにのみ水和されます。

A2:膨大なvar_dumpデータは教義の実体にとっては正常です。Doctrine\Common\Util\Debug::dump($entity)代わりに使用してください。

A3:Doctrineには、クエリと結果のための独自のキャッシュメカニズムがあります。もう一度問い合わせても非効率ではないと思います$book。さらに、DQLは配列のハイドレーションをサポートしています(エンティティではなく配列を返します)。

于 2012-10-25T13:36:19.037 に答える