2016-02-19 3 views
1

Есть ли способ показать общее количество просмотров в виде списка? Представьте, что есть пользователь, который может иметь много ссылок. Как показать общее количество ссылок на просмотр списка?Sonata Admin Bundle: показать общий кол-во коллекции в виде списка

ответ

0

Да, вы можете показать общее количество ссылок для каждого пользователя, я предполагаю, что у вас есть 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'); 
} 
+0

Спасибо! Определенно хорошее решение. –

+0

Но более элегантно описано здесь: http: //stackoverflow.com/questions/8729439/sonataadminbundle-custom-rendering-of-text-fields-in-list –

0

Мой ответ похож на Халида (выше), но имеет некоторые ключевые отличия.

Если вы завернете коллекцию в count($entity->getLinks()), тогда вы получите запрос, который возвращает каждую ассоциацию ссылок.

Недостатком этого является то, что если у вас есть 1000 связанных ссылок, требуемые ресурсы памяти должны быть достаточными для гидратации каждого объекта. (Что может быть огромным, если у вас есть тысячи разных объектов).

Вместо этого вы должны пометить свои объекты как EXTRA_LAZY, а затем использовать метод - - $ entity-> getLinks() -> count() `, который не будет выполнять никаких увлажнений, вместо этого он будет выдавать только запросы COUNT.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

Так сделайте следующее:

/** 
    * @ManyToMany(targetEntity="Links", mappedBy="whatever", fetch="EXTRA_LAZY") 
    */ 
    public $links; 

Тогда вы можете позвонить:

public function getTotalLinks(){ 
     return $this->getLinks()->count(); 
    } 

И это будет супер быстро.

0

Показать поле довольно просто, есть решение для сортировки по этому виртуальному полю.

  1. Entity/Some.php больше о подсчитывать здесь Extra Lazy Associations

    public function getCommentsCount() 
    { 
        return $this->getComments()->count(); 
    } 
    
  2. 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' => [], 
          ] 
         ) 
        //.... 
    } 
    
  3. сервис.YAML добавить "простой" Paginator (количество не работает правильно)

    tags: 
        - { name: sonata.admin, pager_type: "simple", ... 
    

Причины:

  • подзапрос в ОРМ присоединиться не допускается
  • подзапрос в ОРМ OrderBy не допускается
  • HIDDEN поле не работает

\ соната \ DoctrineORMAdminBundle \ Datagrid \ ProxyQuery :: getFixedQueryBuilder (// для SELECT DISTINCT, ORDER BY выражения должны появляться в idxSelect список)