web-dev-qa-db-fra.com

Quelle est la difference entre fetch = "EAGER" et fetch = "LAZY" dans doctrine

Quelle est la différence entre fetch="EAGER" et fetch="LAZY" dans l'annotation @ManyToOne in Doctrine?

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

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

Pour l'expliquer simplement, lorsque vous chargez une entité et si celle-ci est associée à une ou plusieurs entités, que doit doctrine faire?)?

Si l'association est marquée comme [~ # ~] eager [~ # ~] , elle recherchera et chargera également l'entité associée.

Si l'association est marquée comme [~ # ~] paresseuse [~ # ~] , doctrine créera des objets proxy (objets factices) à la place de l'entité réelle.Uniquement lorsque vous effectuez le premier appel à cette entité associée (comme $cart->getItems()), doctrine va récupérer et charger cet objet ( s) de la base de données.

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

78
Pradeep

Informations supplémentaires sur la différence entre eux:

(fetch = "EAGER")

les entités associées seront extraites dès que l'entité cible de la requête d'origine est chargée à partir de la doctrine. Cela signifie qu'il n'y a pas de requête SQL supplémentaire sur la base de données.

(fetch = "LAZY")

les entités associées seront extraites UNIQUEMENT SI l'entité cible de la requête d'origine appelle la méthode de référence, telle que $cart->getItems(). Cela signifie qu'il y a additional requête SQL sur la base de données.

21
vikbert