Оптимизация запросов доктрины в Sonata Admin с помощью LeftJoin

Как оптимизировать запросы к БД, сделанные 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.

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() метод.

Имя контроллера может быть указано в третьем аргументе декларации сервиса.

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;
}

Затем вставьте свой собственный код и верните свой объект.

Вот и все, нет необходимости переопределять контроллер сонаты.

0

По вопросам рекламы [email protected]