Sonata Admin实体列表中的数据库性能问题

时间:2017-08-31 08:35:50

标签: symfony sonata-admin

我正在使用Symfony2和Sonata Admin Bundle,但我遇到了实体列表的性能问题。

我有这个与其他实体有关系的实体:

const authReq = req.clone({
  headers: req.headers.set('ModuleId', this.dnnContext.moduleId.toString()).set('TabId', this.dnnContext.tabId.toString())
});
// Pass on the cloned request instead of the original request.
return next.handle(authReq);

在我的AdminClass上,我想为每个集合显示一些订单详情和其他相关实体信息。

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;

    /* ... */
}

但是这些会为每个被引用的实体创建一个额外的查询。我该如何解决这个问题?

我的第一个想法是扩展createQuery方法:

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

但这没有任何效果。

那么如何通过一个查询设法获取所有需要的数据以减少数据库加载时间?

1 个答案:

答案 0 :(得分:0)

将select添加到您使用左连接加入的表格中。

示例:

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