Как оптимизировать запросы к БД, сделанные sonata admin в списке, и редактировать представления?
Я оставил несколько запросов, которые я сделал с помощью querybuilder в моем хранилище сущностей, это уже очень помогло, снизил количество запросов с 100+ до 22.
Но остальные запросы выполняются автоматически с использованием formbuilder и listmapper.
Могу ли я в дальнейшем оптимизировать запросы, сделанные этими классами?
Я даже не уверен, в данный момент, когда выполняются запросы … я пытался переписать методы findBy, findAll хранилища, но они, кажется, используют что-то вроде
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
return $persister->load($criteria, null, null, array(), 0, 1, $orderBy);
Не уверен, как я могу добавить оператор соединения к этому …
И я предполагаю, что это не только в администраторе сонаты, но также и для запросов, которые я использую во внешнем интерфейсе, использующем встроенные функции поиска, поиска, поиска, поиска и т. Д. EntityRepository.
В вашем классе администратора переопределите createQuery()
метод как это:
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
$query
->addSelect(...)
->leftJoin(...) // use $query->getRootAlias() here
;
return $query;
}
Для режима редактирования это немного сложнее, потому что вам нужно переопределить контроллер сонаты, расширяя Sonata\AdminBundle\Controller\CRUDController
а затем переопределить 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;
}
Затем вставьте свой собственный код и верните свой объект.
Вот и все, нет необходимости переопределять контроллер сонаты.