SonataAdminBundle预加载SQL对象

时间:2013-12-12 02:24:39

标签: symfony doctrine sonata-admin

使用SonataAdminBundle时,我试图可视化数据库的叶节点。我的桌子是A - > B - > C( - > =包含一些)。我尝试可视化的叶节点是C.

C有一个__toString(),它将调用B .__ toString(),然后调用A .__ toString()。

问题:我最终显示30行并对数据库进行700次调用。

有时,我可以通过添加过滤器来避免这个问题,因此它会首先使用过滤器发出请求并“预加载”某些对象,但在这种情况下,我无法添加过滤器。

有预先预装物品的方法吗?答案可能包含两部分:

  • 我应该在奏鸣曲的哪个地方做这个?
  • 我应该执行哪些代码来预加载对象层次结构,以最大限度地减少对数据库的调用量?

1 个答案:

答案 0 :(得分: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方法返回Sonata ProxyQuery对象,而不是Doctrine Query。因此,您应该对Admin::createQuery返回的查询进行操作。