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

Как вы оптимизируете запросы БД, сделанные администратором соната в списке, и редактируете представления?

i 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); 

Не знаю, как я могу добавить заявление о соединении к этому …

И я предполагаю, что это не только в администраторе сонаты, но и для запросов, которые я использую в интерфейсе, которые используют встроенные функции 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 и затем переопределите метод 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; } 

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

Вот и все, не нужно переопределять контроллер сонаты.