如何在列表和编辑视图中优化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等等...查询的查询。
答案 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;
}
然后将您自己的代码放入并返回您的对象。
这就是全部,无需覆盖奏鸣曲控制器。