使用LeftJoin优化Sonata Admin中的学说查询

时间:2014-10-19 04:29:51

标签: php symfony doctrine-orm sonata-admin

如何在列表和编辑视图中优化sonata admin所做的数据库查询?

我在LeftJoined中使用我的实体存储库中的querybuilder进行了一些查询,这已经帮助了很多,将我的查询从100+减少到大约22。

但剩下的查询是使用formbuilder和listmapper自动发生的查询。

无论如何,我可以进一步优化这些类的查询吗? 我甚至不确定在哪里进行查询...我试图覆盖findBy,findAll方法的存储库,但他们似乎使用类似

的东西
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
return $persister->load($criteria, null, null, array(), 0, 1, $orderBy);

不确定如何将加入声明添加到...

我想这不仅仅是在sonata管理员中,而且还包括我在前端使用内置EntityRepository find,findAll,findOneBy等等...查询的查询。

2 个答案:

答案 0 :(得分:0)

在您的管理类中,覆盖createQuery()方法,如下所示:

public function createQuery($context = 'list')
{
    $query = parent::createQuery($context);

    $query
        ->addSelect(...)
        ->leftJoin(...) // use $query->getRootAlias() here
    ;

    return $query;
}

对于编辑视图,它有点棘手,因为您需要通过扩展Sonata\AdminBundle\Controller\CRUDController来覆盖奏鸣曲控制器,然后覆盖editAction()方法。

可以在服务声明的第三个参数中指定控制器名称。

答案 1 :(得分:0)

我知道这个月,但是如果它可以帮助某人:

我不想更改控制器,所以我看一下代码。

在您的管理类中,您可以覆盖函数getObject($ id):

// code from sonata admin class
public function getObject($id)
{
    $object = $this->getModelManager()->find($this->getClass(), $id);
    foreach ($this->getExtensions() as $extension) {
        $extension->alterObject($this, $object);
    }
    return $object;
}

然后将您自己的代码放入并返回您的对象。

这就是全部,无需覆盖奏鸣曲控制器。