Подтвердить что ты не робот

В чем разница между fetch = "EAGER" и fetch = "LAZY" в доктрине

В чем разница между fetch="EAGER" и fetch="LAZY" в аннотации @ManyToOne в Doctrine?

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

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

Ответ 1

Чтобы просто объяснить это, когда вы загружаете сущность и имеет ли она связь с одним или несколькими объектами, что должно делать доктрина?

Если ассоциация отмечена как EAGER, она будет извлекать и загружать связанный объект.

Если ассоциация отмечена как LAZY, доктрина создаст прокси-объекты (фиктивные объекты) вместо фактического объекта. Только когда вы делаете первый вызов этого связанного объекта (например, $cart->getItems()), доктрина будет извлекать и загружать этот объект из базы данных.

Refer: http://docs.doctrine-project.org/en/latest/reference/advanced-configuration.html#association-proxies

Ответ 2

Дополнительная информация о различии между ними:

(fetch = "EAGER")

связанные объекты будут получены, как только исходный объект запроса запроса будет загружен из доктрины. Это означает, что в DB нет дополнительного SQL-запроса.

(fetch = "LAZY")

ассоциированные объекты будут извлекаться ТОЛЬКО, если исходный объект запроса запроса вызывает ссылочный метод, например $cart->getItems(). Это означает, что в базе данных имеется additional SQL-запрос.