在 Symfony 3.4 Easy Admin 包中显示大量实体的总数
Show aggregate count of large number of entities in Symfony 3.4 Easy Admin bundle
我正在尝试为实体列表视图显示相关实体的计数,但是实体太多,因此它在实体中耗尽了内存(它做了一个简单的 count($this->relatedEntities)
)。
任何想法 how/where 我可以覆盖 QueryBuilder
的 ListController
以添加聚合的 COUNT()
列吗?
我尝试扩展 AdminController
并连接到 findAll()
函数(手动为每个对象添加一个计数),但这并没有给我一个实体列表,而是一个 Pagerfanta
对象。
这是我修复它的方法:
覆盖自定义 AdminController 中的 renderTemplate:
protected function renderTemplate($actionName, $templatePath, array $parameters = array())
{
if ($actionName === 'list' && $this->entity['class'] === ClassA::class) {
//piggyback on virtual property 'count'
$parameters['fields']['count']['servicecounts'] = $this->MyEntityRepository->getCounts();
}
return $this->render($templatePath, $parameters);
}
easy_admin 配置:
list:
fields:
- { property: 'count', template: 'count.html.twig' }
count.html.twig:
{{ field_options.servicecounts[item.id] }}
getCounts 函数:
public function getCounts()
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->select('s.id, count(ce.recordId)')
->from(ClassA::class, 's')
->leftJoin(ClassB::class, 'ce', Join::WITH, 's.id = ce.service')
->groupBy('s.id')
;
$results = [];
foreach ($qb->getQuery()->execute() as $row) {
$results[$row['id']] = $row[1];
}
return $results;
}
我正在尝试为实体列表视图显示相关实体的计数,但是实体太多,因此它在实体中耗尽了内存(它做了一个简单的 count($this->relatedEntities)
)。
任何想法 how/where 我可以覆盖 QueryBuilder
的 ListController
以添加聚合的 COUNT()
列吗?
我尝试扩展 AdminController
并连接到 findAll()
函数(手动为每个对象添加一个计数),但这并没有给我一个实体列表,而是一个 Pagerfanta
对象。
这是我修复它的方法:
覆盖自定义 AdminController 中的 renderTemplate:
protected function renderTemplate($actionName, $templatePath, array $parameters = array())
{
if ($actionName === 'list' && $this->entity['class'] === ClassA::class) {
//piggyback on virtual property 'count'
$parameters['fields']['count']['servicecounts'] = $this->MyEntityRepository->getCounts();
}
return $this->render($templatePath, $parameters);
}
easy_admin 配置:
list:
fields:
- { property: 'count', template: 'count.html.twig' }
count.html.twig:
{{ field_options.servicecounts[item.id] }}
getCounts 函数:
public function getCounts()
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb
->select('s.id, count(ce.recordId)')
->from(ClassA::class, 's')
->leftJoin(ClassB::class, 'ce', Join::WITH, 's.id = ce.service')
->groupBy('s.id')
;
$results = [];
foreach ($qb->getQuery()->execute() as $row) {
$results[$row['id']] = $row[1];
}
return $results;
}