Sonata Admin Bundle:在列表视图中显示集合总数
Sonata Admin Bundle: show total count of collection on list view
有没有办法在列表视图中显示集合的总数?想象一下,有一个用户可以有很多链接。如何在列表视图中显示总链接数?
是的,您可以显示每个用户的链接总数,我假设您在用户实体中定义了链接数组集合,定义了一个名为 $totalLinks
的 属性 和 getter 其中 属性 return 个链接如下所示
class User{
public $totalLinks;
public function getTotalLinks(){
return count($this->getLinks());
}
}
然后在您的 configureListFields()
中您可以添加 $totalLinks
属性
protected function configureListFields(ListMapper $list)
{
$list
->add('...')
->add('...')
->add('totalLinks');
}
在这里找到答案:
SonataAdminBundle custom rendering of text fields in list
我使用的是 Sonata 2.3,所以 TWIG 模板应该是这样的:
{% extends admin.getTemplate('base_list_field') %}
{% block field %}
{{ value|length }}
{% endblock %}
我的回答与 Khalid(上图)相似,但有一些关键差异。
如果您将集合包装在 count( $entity->getLinks() )
中,那么这将发出一个查询,其中 returns 每个 link 关联。
这样做的缺点是,如果您关联了 1000 个链接,则所需的内存资源将需要足以水化每个实体。 (如果您有数千个不同的实体,这可能会很大)。
相反,您应该将您的实体标记为 EXTRA_LAZY,然后使用 --
$entity->getLinks()->count()` 方法,该方法不会进行任何水合作用,而是它只会发出 COUNT 个查询。
所以请执行以下操作:
/**
* @ManyToMany(targetEntity="Links", mappedBy="whatever", fetch="EXTRA_LAZY")
*/
public $links;
那么您可以拨打:
public function getTotalLinks(){
return $this->getLinks()->count();
}
而且会超级快。
显示字段很简单,这个虚拟字段排序有解决办法
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 添加 "simple" 分页器(计数无法正常工作)
tags:
- { name: sonata.admin, pager_type: "simple", ...
原因:
- 不允许在 orm 连接中使用子查询
- 不允许在 orm orderBy 中使用子查询
- HIDDEN 字段不起作用
\Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::getFixedQueryBuilder
(// for SELECT DISTINCT, ORDER BY expressions must appear in idxSelect
list)
与奏鸣曲 3.**
在 Admin 的某个地方***。php 用于列出所有字段的脚本:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
//...
->addIdentifier('getCommentsCount', IntegerType::class, [ 'label' => '#Comments'])
;
}
我在 Entity 的哪个地方写了这样的东西:
public function getCommentsCount()
{
return $this->comments->count();
}
对我有用)
有没有办法在列表视图中显示集合的总数?想象一下,有一个用户可以有很多链接。如何在列表视图中显示总链接数?
是的,您可以显示每个用户的链接总数,我假设您在用户实体中定义了链接数组集合,定义了一个名为 $totalLinks
的 属性 和 getter 其中 属性 return 个链接如下所示
class User{
public $totalLinks;
public function getTotalLinks(){
return count($this->getLinks());
}
}
然后在您的 configureListFields()
中您可以添加 $totalLinks
属性
protected function configureListFields(ListMapper $list)
{
$list
->add('...')
->add('...')
->add('totalLinks');
}
在这里找到答案:
SonataAdminBundle custom rendering of text fields in list
我使用的是 Sonata 2.3,所以 TWIG 模板应该是这样的:
{% extends admin.getTemplate('base_list_field') %}
{% block field %}
{{ value|length }}
{% endblock %}
我的回答与 Khalid(上图)相似,但有一些关键差异。
如果您将集合包装在 count( $entity->getLinks() )
中,那么这将发出一个查询,其中 returns 每个 link 关联。
这样做的缺点是,如果您关联了 1000 个链接,则所需的内存资源将需要足以水化每个实体。 (如果您有数千个不同的实体,这可能会很大)。
相反,您应该将您的实体标记为 EXTRA_LAZY,然后使用 --
$entity->getLinks()->count()` 方法,该方法不会进行任何水合作用,而是它只会发出 COUNT 个查询。
所以请执行以下操作:
/**
* @ManyToMany(targetEntity="Links", mappedBy="whatever", fetch="EXTRA_LAZY")
*/
public $links;
那么您可以拨打:
public function getTotalLinks(){
return $this->getLinks()->count();
}
而且会超级快。
显示字段很简单,这个虚拟字段排序有解决办法
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 添加 "simple" 分页器(计数无法正常工作)
tags: - { name: sonata.admin, pager_type: "simple", ...
原因:
- 不允许在 orm 连接中使用子查询
- 不允许在 orm orderBy 中使用子查询
- HIDDEN 字段不起作用
\Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::getFixedQueryBuilder (// for SELECT DISTINCT, ORDER BY expressions must appear in idxSelect list)
与奏鸣曲 3.** 在 Admin 的某个地方***。php 用于列出所有字段的脚本:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
//...
->addIdentifier('getCommentsCount', IntegerType::class, [ 'label' => '#Comments'])
;
}
我在 Entity 的哪个地方写了这样的东西:
public function getCommentsCount()
{
return $this->comments->count();
}
对我有用)