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

问题描述 投票:3回答:5

有没有办法在列表视图中显示收集的总数?想象一下,有一个用户可以有很多链接。如何在列表视图中显示总链接数?

sonata-admin symfony-sonata
5个回答
4
投票

我的答案类似于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();
    }

而且速度非常快。


3
投票

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

  1. 实体/ 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']) ; } //... } /** * @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 join中使用子查询
  • orm orderBy中的子查询是不允许的
  • HIDDEN字段不起作用

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


0
投票

是的,您可以显示每个用户的链接总数,我假设您在用户实体中定义了链接的数组,定义了一个名为$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
投票

与索纳塔3。**

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

Post.php的地方:

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

这对我行得通 )


-1
投票

在这里找到答案:

SonataAdminBundle custom rendering of text fields in list

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

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

{% block field %}
    {{ value|length }}
{% endblock %}
© www.soinside.com 2019 - 2024. All rights reserved.