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

时间:2016-02-19 11:45:06

标签: sonata-admin symfony-sonata

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

5 个答案:

答案 0 :(得分:2)

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

它会非常快。

答案 1 :(得分:2)

显示字段非常简单,有按此虚拟字段排序的解决方案。

  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 添加"简单" paginator(计数无法正常工作)

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

    • 不允许使用orm join中的子查询
    • orm orderBy中的子查询不允许
    • HIDDEN字段不起作用
      

    \奏\ DoctrineORMAdminBundle \数据网格\ ProxyQuery :: getFixedQueryBuilder   (//对于SELECT DISTINCT,ORDER BY表达式必须出现在idxSelect中   列表)

答案 2 :(得分: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');
}

答案 3 :(得分:0)

在这里找到答案:

Removing the Edit Chart link from an R plotly graph

我正在使用Sonata 2.3,因此TWIG模板应该像:

Sub copyBetweenWorkbooks()

    Dim wkbkA As Workbook
    Dim wkbkB As Workbook
    Dim copyValues As Range
    Dim directory As String, fileName As String, i As Long, j As Long

    Application.ScreenUpdating = False
    directory = "c:\test\"
    fileName = Dir(directory & "yourspreadsheet.xls")

    Set wkbkA = ThisWorkbook
    Set copyValues = wkbkA.Sheets({ put sheet here}).Range({put range here})
    Set wkbkB = Workbooks.Open(directory & fileName)

    With wkbkB

        'do your stuff here

    End With

    'close your stuff if you need to
    Workbooks(fileName).Close
    Application.ScreenUpdating = True

End Sub

答案 4 :(得分:0)

使用Sonata 3。**

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

其中Post.php:

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

对我有用的