2016-04-14 38 views
1

Symfony 2.8を使用しています。SymfonyとDoctrine:遅延ロードが機能していません

私はコミュニティのMenuItemのセットを持ってエンティティ、MenuItemのコミュニティを持っています。 Iを使用する場合、

... 
    /** 
    * @var Community 
    * 
    * @ORM\ManyToOne(targetEntity="Community", inversedBy="menuItems") 
    */ 
    private $community; 
... 

点がある:

... 
    /** 
    * @ORM\OneToMany(targetEntity="MenuItem", mappedBy="community", fetch="LAZY") 
    * @ORM\OrderBy({"sequence" = "ASC"}) 
    */ 
    private $menuItems; 
... 

MenuItem.php次のコードを持っている:

Community.phpは、以下のコードを有する

$menuItems = $community->getMenuItems(); 

$menuItems変数は空のコレクションになります。そのようにカテゴリーエンティティの$menuItems属性はすぐにロードされているので、

問題は、fetch="EAGER"代わりのfetch="LAZY"を設定することによって解決することができます。 EAGER(source)対LAZY

お手元に管理エンティティインスタンスを持っているときはいつでも、あなたが通過すると、彼らはすでにメモリ内であるかのようにLAZYに設定されているエンティティの任意の関連付けを使用することができます。 Doctrineは、レイジーローディングのコンセプトにより、必要に応じて関連オブジェクトを自動的にロードします。

永続的な関連付けを持つエンティティを照会し、これらの関連付けがEAGERとしてマップされると、それらは照会されるエンティティと一緒に自動的にロードされ、アプリケーションですぐに使用できます。

EAGERの読み込みは期待どおりに動作していますが、LAZYの読み込みはまったく動作していないようです。理由は何ですか?

答えて

0

あなたが$community->getMenuItems();をやっている:EAGERモードで

  • :データがすでに取り込まれ、その配列が返されます。
  • LAZYモードでは、呼び出しを行うとデータベース要求が行われます。シーンの裏側では、エンティティの前に「プロキシー」を生成して、あなたのために教義を呼びます。遅延読み込みと

気をつけ:

簡単にSQLクエリの多くをトリガーするレイジーロードされ、頻繁に使用する場合はひどく実行する部品のためのオブジェクトグラフのトラバース。

DQLフェッチを実行して、データを直接取得する方がよい場合があります。例えばhttp://blog.bemycto.com/good-practices/2015-05-31/understanding-doctrine-orm-lazy-load-fetch-join/

0

個人的には、私はジョインで1つのクエリで実行できる多くのクエリが実行されるため、怠惰な/熱心な読み込みのファンではありません。

カスタムクエリを作成するカスタムリポジトリを実装する方法については、ここをクリックしてください。link

関連する問題