web-dev-qa-db-ja.com

doctrineのfetch = "EAGER"とfetch = "LAZY"の違いは何ですか

違いは何ですか fetch="EAGER"およびfetch="LAZY"アノテーション@ManyToOne in Doctrine?

/**
 * @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="EAGER")
 */

/**
 * @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="LAZY")
 */
51

簡単に説明すると、エンティティを読み込んでいて、それが1つ以上のエンティティと関連付けられている場合、doctrine do?

関連付けが[〜#〜] eager [〜#〜]としてマークされている場合、関連付けられたエンティティもフェッチしてロードします。

関連付けが[〜#〜] lazy [〜#〜]とマークされている場合、doctrineはプロキシオブジェクトを作成します(ダミーオブジェクト)実際のエンティティの代わりに。その関連エンティティ($cart->getItems()など)を最初に呼び出したときのみ、doctrineはそのオブジェクトをフェッチしてロードしますs)データベースから。

参照: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/advanced-configuration.html#association-proxies

78
Pradeep

それらの違いに関する追加情報:

_(fetch = "EAGER")_

元のクエリターゲットエンティティがDoctrineからロードされるとすぐに、関連するエンティティが取得されます。つまり、DBには追加のSQLクエリはありません。

_(fetch = "LAZY")_

関連するエンティティは、元のクエリターゲットエンティティが$cart->getItems()などの参照メソッドを呼び出す場合にのみフェッチされます。つまり、DBにはadditional SQLクエリがあります。

21
vikbert