2016-04-14 55 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