2017-08-31 70 views
1

我正在使用Symfony2和Sonata管理軟件包,但遇到了實體列表的性能問題。Sonata管理實體列表中的數據庫性能問題

我有這樣的實體關係到其他實體:

class Collection 
{ 
    /** 
    * Primary Key - autoincrement value 
    * 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * OWNING SIDE 
    * 
    * @ORM\ManyToOne(targetEntity="\App\Entity\Order") 
    * @ORM\JoinColumn(name="orderId", referencedColumnName="id") 
    * @var \App\Entity\Order 
    */ 
    protected $order; 

    /* ... */ 
} 

在我AdminClass我想顯示每個收集一些訂單的詳細信息及其他相關實體的信息。

protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->add('id') 
     ->add(
      'order.number', 
      null, 
      array(
       'template' => 'App:Admin:Field/order-data.html.twig', 
       'label' => 'Order Number' 
      ) 
     ); 
} 

但是,這些創建每個引用實體一個額外的查詢。我該如何解決這個問題?

我的第一個想法是延長的createQuery方法:

public function createQuery($context = 'list') 
{ 
    /** @var \Doctrine\ORM\QueryBuilder|QueryBuilder $query */ 
    $query = parent::createQuery($context); 
    $query 
     ->addSelect($query->getRootAliases()[0]) 
     ->addSelect('collectionOrder') 
    ; 

    $query 
     ->leftJoin($query->getRootAliases()[0] . '.order', 'collectionOrder') 
    ; 

    return $query; 
} 

但是,這將不起作用。

那麼我怎樣才能設法得到所有需要的數據與一個查詢,以減少數據庫加載時間?

回答

0

將select添加到您用左連接加入的表中。

實施例:

$query 
    ->leftJoin($query->getRootAliases()[0] . '.order', 'collectionOrder') 
    ->addSelect('collectionOrder') 
;