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")
*/
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.
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.