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

Moh*_*nda 53 orm many-to-many doctrine-orm

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

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

/**
 * @ManyToOne(targetEntity="Cart", cascade={"all"}, fetch="LAZY")
 */
Run Code Online (Sandbox Code Playgroud)

Pra*_*eep 83

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

如果关联被标记为EAGER,它也将获取并加载关联的实体.

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

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

  • 正如我所见,延迟加载是学说的默认设置:http://doctrine-orm.readthedocs.io/en/latest/tutorials/extra-lazy-associations.html (2认同)
  • “Calamity Jane”的链接不再有效,这里是更新的链接(2.6):https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/extra-lazy -associations.html#extra-lazy-associations 。引用有关默认行为的链接:“默认情况下,关联被标记为惰性,这意味着关联的整个集合对象将在第一次访问时填充。” (2认同)
  • @famas23 LAZY 可能会更快,但这仅取决于您需要什么。如果您从不使用这些相关部件,那么它肯定会更快,因为保湿工作要做的更少。否则,如果您知道您实际上将使用关联的部件,那么立即加载它们是有意义的。 (2认同)

vik*_*ert 23

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

(fetch = "EAGER")

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

(fetch = "LAZY")

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

  • 谢谢。我来到这里想知道在获取目标时急切获取是否会导致额外的查询。 (2认同)