使用LeftJoin优化Sonata Admin中的条令查询


Optimizing doctrine queries in Sonata Admin with LeftJoin

如何优化sonata管理员在列表和编辑视图中进行的DB查询?

我在实体存储库中使用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等函数的查询中也是如此。

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

public function createQuery($context = 'list')
{
    $query = parent::createQuery($context);
    $query
        ->addSelect(...)
        ->leftJoin(...) // use $query->getRootAlias() here
    ;
    return $query;
}

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

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

我知道它有一个月了,但如果它能帮助某人:

我不想更改控制器,所以我查看了代码内部。

在您的管理类中,您可以覆盖函数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;
}

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

仅此而已,无需覆盖sonata控制器。