2013-12-12 21 views
1

當使用SonataAdminBundle時,我試圖可視化數據庫的葉節點。我的表是A - > B - > C( - > =包含一些)。我嘗試想象的葉節點是C.SonataAdminBundle預加載SQL對象

C有一個__toString(),它將調用B .__ toString(),它依次調用A .__ toString()。

問題:我最終顯示了30行並對數據庫進行了700次調用。

有時,我可以通過添加一個過濾器來避免這個問題,所以它會首先使用過濾器發出請求,並「預加載」一些對象,但在這種情況下,我無法添加過濾器。

有沒有辦法預先加載我的對象?答案很可能會包含兩個部分:

  • 凡奏鳴曲我應該這樣做?
  • 我應該執行哪些代碼來預加載對象的層次結構,以最大限度地減少對數據庫的調用量?

回答

2

您應該重寫方法createQuery,您可以在其中放置自定義連接。

實施例:

<?php 

namespace Acme\DemoBundle\Admin; 

use Sonata\AdminBundle\Admin\Admin; 

class CarAdmin extends Admin 
{ 
    public function createQuery($context = 'list') 
    { 
     $query = parent::createQuery($context); 
     $query->leftJoin($query->getRootAlias . '.Model', 'mo'); 
     $query->leftJoin('mo.Make', 'ma'); 

     return $query; 
    } 
} 

記住,createQuery方法返回奏ProxyQuery對象,而不是原則的查詢。所以你應該對由Admin::createQuery返回的查詢進行操作。

+0

這正是我所需要的。 – jsgoupil

+0

但是,過濾器也有同樣的問題。我應該在哪裏運行JOIN以正確獲取過濾器屬性? – jsgoupil