fetch =" EAGER"有什么区别?和fetch =" LAZY"在学说中

时间:2014-11-12 16:22:24

标签: orm doctrine-orm many-to-many

Doctrine中注释fetch="EAGER"中的fetch="LAZY"@ManyToOne之间有什么区别?

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

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

2 个答案:

答案 0 :(得分:78)

简单地解释一下,当你加载一个实体并且它与一个或多个实体有关联时,学说应该做什么?

如果关联标记为 EAGER ,它也会获取并加载关联的实体。

如果关联标记为 LAZY ,则doctrine将创建代理对象(虚拟对象)来代替实际实体。只有当您第一次调用该关联实体(如$cart->getItems())时,doctrine才会从数据库中获取并加载该对象。

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

答案 1 :(得分:20)

有关它们之间差异的其他信息:

(fetch = "EAGER")

一旦从doctrine加载原始查询目标实体,就会获取关联的实体。这意味着DB上没有其他SQL查询。

(fetch = "LAZY")

仅在原始查询目标实体调用引用方法(例如$cart->getItems())时才会获取关联实体。这意味着,DB上有additional个SQL查询。