【问题标题】:Sonata Admin Bundle: show total count of collection on list viewSonata Admin Bundle:在列表视图中显示收藏总数
【发布时间】:2016-05-31 23:31:20
【问题描述】:

有没有办法在列表视图中显示集合的总数?假设有一个用户可以有很多链接。如何在列表视图中显示总链接数?

【问题讨论】:

    标签: sonata-admin symfony-sonata


    【解决方案1】:

    是的,您可以显示每个用户的链接总数,我假设您在用户实体中定义了链接的数组集合,定义了一个名为 $totalLinks 的属性,并在该属性的获取器中返回链接计数,如下所示

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

    然后在您的configureListFields() 中添加$totalLinks 属性

    protected function configureListFields(ListMapper $list)
    {
        $list
        ->add('...')
        ->add('...')
        ->add('totalLinks');
    }
    

    【讨论】:

    【解决方案2】:

    在这里找到答案:

    SonataAdminBundle custom rendering of text fields in list

    我使用的是 Sonata 2.3,所以 TWIG 模板应该是这样的:

    {% extends admin.getTemplate('base_list_field') %}
    
    {% block field %}
        {{ value|length }}
    {% endblock %}
    

    【讨论】:

      【解决方案3】:

      我的回答与 Khalid(上图)相似,但有一些关键区别。

      如果您将集合包装在 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();
          }
      

      而且会超级快。

      【讨论】:

        【解决方案4】:

        显示字段很简单,有这个虚拟字段排序的解决方案。

        1. Entity/Some.php 更多关于计数在这里Extra Lazy Associations

          public function getCommentsCount()
          {
              return $this->getComments()->count();
          }
          
        2. SomeAdmin.php 覆盖 createQuery 并配置列表字段

          public function createQuery($context = 'list')
          {
              $query = parent::createQuery($context);
              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'])
                      ;
                  }
                  //...
              }
              return $query;
          }
          
          /**
           * @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. service.yaml 添加“简单”分页器(计数无法正常工作)

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

        原因:

        • 不允许在 orm 连接中进行子查询
        • 不允许使用 orm orderBy 的子查询
        • HIDDEN 字段不起作用

        \Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::getFixedQueryBuilder (// 对于 SELECT DISTINCT,ORDER BY 表达式必须出现在 idxSelect 中 列表)

        【讨论】:

        • 没有看到你在第二步第 4 行定义了 var $query
        • $query = parent::createQuery($context);
        【解决方案5】:

        与奏鸣曲 3.** 在 Admin***.php 脚本的某个地方列出所有字段:

            protected function configureListFields(ListMapper $listMapper)
            {
                $listMapper
        //...
                    ->addIdentifier('getCommentsCount', IntegerType::class, [ 'label' => '#Comments'])
                ;
            } 
        

        我在实体的哪里写了这样的东西:

            public function getCommentsCount()
            {
                return $this->comments->count();
            }
        

        这对我有用)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-15
          • 2016-04-20
          • 2018-07-22
          • 2015-05-15
          • 2016-09-03
          • 2016-12-18
          相关资源
          最近更新 更多