Как вы оптимизируете запросы БД, сделанные администратором соната в списке, и редактируете представления?
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; }
Затем введите свой собственный код и верните свой объект.
Вот и все, не нужно переопределять контроллер сонаты.