2016-04-14 62 views
1

使用Symfony 2.8。Symfony和Doctrine:懒加载不起作用

社区菜单项实体,其中社区有一组的MenuItems

Community.php具有下面的代码:

... 
    /** 
    * @ORM\OneToMany(targetEntity="MenuItem", mappedBy="community", fetch="LAZY") 
    * @ORM\OrderBy({"sequence" = "ASC"}) 
    */ 
    private $menuItems; 
... 

MenuItem.php具有下面的代码:

... 
    /** 
    * @var Community 
    * 
    * @ORM\ManyToOne(targetEntity="Community", inversedBy="menuItems") 
    */ 
    private $community; 
... 

的一点是,当我使用:

$menuItems = $community->getMenuItems(); 

the $menuItems变量将是一个空集合。

的问题可以通过设置fetch="EAGER"而不是fetch="LAZY",因为在这种方式类别实体的$menuItems属性立刻加载来解决。

LAZY VS EAGER(source):

只要您手边有一个管理实体实例,您可以遍历和使用,就好像他们是在内存中已经被配置LAZY该实体的任何关联。 Doctrine将通过延迟加载的概念按需自动加载关联的对象。

每当您查询具有持久关联的实体并将这些关联映射为EAGER时,它们将自动与正在查询的实体一起加载,因此可立即供您的应用程序使用。

问题是,虽然EAGER加载按预期工作,但LAZY加载似乎根本不起作用。任何想法为什么?

回答

0

当你在做$community->getMenuItems();

  • 在EAGER模式:数据已经取出,所以返回的数组。
  • 在LAZY模式下:数据库请求在您进行呼叫时完成。在幕后,它通过在你的实体前面生成“代理”来为你工作。

小心,利用迟缓装载:

遍历该懒惰载,否则会容易引发大量的SQL查询,并且如果用于重将严重执行部件对象图。

通过执行DQL获取,直接获取数据会更好。看到例如http://blog.bemycto.com/good-practices/2015-05-31/understanding-doctrine-orm-lazy-load-fetch-join/

0

就个人而言,我不是懒惰/渴望加载的粉丝,因为许多查询将被解雇,当他们可以在一个带有连接的查询完成。

请在此处查看我的答案,了解如何实施定制存储库以构建自定义查询,link