2017-08-31 97 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') 
;