Sonata Admin Bundle:在列表视图上显示集合总数

Ser*_*nov 3 symfony-sonata sonata-admin

有什么方法可以在列表视图上显示收集的总数吗?想象有一个用户可以有许多链接。如何在列表视图中显示总链接数?

Lay*_*yke 6

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

如果您将集合包装在 a 中,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;
Run Code Online (Sandbox Code Playgroud)

然后你可以调用:

public function getTotalLinks(){
        return $this->getLinks()->count();
    }
Run Code Online (Sandbox Code Playgroud)

而且会超级快。


Vla*_*Pak 5

显示字段很容易,有按此虚拟字段排序的解决方案。

  1. 实体/ Some.php这里更多关于计数的额外延迟关联

    public function getCommentsCount()
    {
        return $this->getComments()->count();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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'])
                ;
            }
            //...
    }
    
    /**
     * @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' => [],
                ]
            )
         //....
     }
    
    Run Code Online (Sandbox Code Playgroud)
  3. service.yaml添加“简单”分页器(计数无法正常工作)

    tags:
        - { name: sonata.admin, pager_type: "simple", ...
    
    Run Code Online (Sandbox Code Playgroud)

原因:

  • 不允许在orm join中使用子查询
  • 按ORM顺序的子查询不允许
  • 隐藏字段不起作用

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


Ser*_*nov 0

在这里找到答案:

SonataAdminBundle 自定义呈现列表中的文本字段

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

{% extends admin.getTemplate('base_list_field') %}

{% block field %}
    {{ value|length }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)