Sonata Admin Bundle:在列表视图中显示收藏总数

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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');

【讨论】:

但更优雅的描述在这里:***.com/questions/8729439/…【参考方案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】:

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

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

    public function getCommentsCount()
    
        return $this->getComments()->count();
    
    

    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' => [],
                ]
            )
         //....
     
    

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

这对我有用)

【讨论】:

以上是关于Sonata Admin Bundle:在列表视图中显示收藏总数的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Admin Bundle 如何配置批处理操作

带有 FosUserBundle 的 Sonata Admin Bundle 列表

在sonata admin Bundle的List视图中添加新Button

Sonata Admin Bundle:如何将表单中的“删除”按钮添加到嵌套实体列表中的实体?

Sonata mongodb admin bundle filter by reference

在 Sonata Admin 的列表视图(角色/权限)中编辑