Есть ли способ показать общее количество просмотров в виде списка? Представьте, что есть пользователь, который может иметь много ссылок. Как показать общее количество ссылок на просмотр списка?Sonata Admin Bundle: показать общий кол-во коллекции в виде списка
ответ
Найдено ответ здесь:
SonataAdminBundle custom rendering of text fields in list
Я использую Sonata 2.3 так шаблон TWIG должен быть как:
{% extends admin.getTemplate('base_list_field') %}
{% block field %}
{{ value|length }}
{% endblock %}
Да, вы можете показать общее количество ссылок для каждого пользователя, я предполагаю, что у вас есть arraycollection ссылок, определенных в вашей пользовательской сущности, определите свойство с именем $totalLinks
и в getter этого свойства возвратите количество ссылок, что-то вроде ниже
class User{
public $totalLinks;
public function getTotalLinks(){
return count($this->getLinks());
}
}
, а затем в вашем configureListFields()
вы можете добавить $totalLinks
свойство
protected function configureListFields(ListMapper $list)
{
$list
->add('...')
->add('...')
->add('totalLinks');
}
Мой ответ похож на Халида (выше), но имеет некоторые ключевые отличия.
Если вы завернете коллекцию в count($entity->getLinks())
, тогда вы получите запрос, который возвращает каждую ассоциацию ссылок.
Недостатком этого является то, что если у вас есть 1000 связанных ссылок, требуемые ресурсы памяти должны быть достаточными для гидратации каждого объекта. (Что может быть огромным, если у вас есть тысячи разных объектов).
Вместо этого вы должны пометить свои объекты как EXTRA_LAZY, а затем использовать метод - -
$ entity-> getLinks() -> count() `, который не будет выполнять никаких увлажнений, вместо этого он будет выдавать только запросы COUNT.
Так сделайте следующее:
/**
* @ManyToMany(targetEntity="Links", mappedBy="whatever", fetch="EXTRA_LAZY")
*/
public $links;
Тогда вы можете позвонить:
public function getTotalLinks(){
return $this->getLinks()->count();
}
И это будет супер быстро.
Показать поле довольно просто, есть решение для сортировки по этому виртуальному полю.
Entity/Some.php больше о подсчитывать здесь Extra Lazy Associations
public function getCommentsCount() { return $this->getComments()->count(); }
SomeAdmin.php переопределение CreateQuery и настроить список полей
public function createQuery($context = 'list') { if ('list' === $context) { $rootAlias = $query->getRootAliases()[0]; //... $parameters = $this->getFilterParameters(); if ('getCommentsCount' === $parameters['_sort_by']) { $query ->leftJoin($rootAlias.'. comments', 'cm') ->groupBy($rootAlias.'.id') ->orderBy('COUNT(cm.id)', $parameters['_sort_order']) ; } //... } /** * @param ListMapper $listMapper */ protected function configureListFields(ListMapper $listMapper) { $listMapper ->add('id') //... ->add( 'getCommentsCount', null, [ 'sortable' => true, 'sort_field_mapping' => ['fieldName' => 'id'], 'sort_parent_association_mappings' => [], ] ) //.... }
сервис.YAML добавить "простой" Paginator (количество не работает правильно)
tags: - { name: sonata.admin, pager_type: "simple", ...
Причины:
- подзапрос в ОРМ присоединиться не допускается
- подзапрос в ОРМ OrderBy не допускается
- HIDDEN поле не работает
\ соната \ DoctrineORMAdminBundle \ Datagrid \ ProxyQuery :: getFixedQueryBuilder (// для SELECT DISTINCT, ORDER BY выражения должны появляться в idxSelect список)
Спасибо! Определенно хорошее решение. –
Но более элегантно описано здесь: http: //stackoverflow.com/questions/8729439/sonataadminbundle-custom-rendering-of-text-fields-in-list –