Показать совокупное количество большого количества сущностей в пакете Symfony 3.4 Easy Admin

Я пытаюсь показать количество связанных сущностей для представления списка сущностей, но их слишком много, поэтому у него заканчивается память (это простой count($this->relatedEntities)) в сущности.

Есть идеи, как / где я могу переопределить ListController из QueryBuilder, чтобы добавить агрегированный столбец COUNT()?

Я попытался расширить AdminController и подключиться к функции findAll() (чтобы вручную добавить счетчик к каждому объекту), но это дает мне не список сущностей, а объект Pagerfanta.


person Oli    schedule 17.12.2018    source источник
comment
проверьте это: stackoverflow.com/a/9215880/4716084   -  person LBA    schedule 17.12.2018
comment
Кроме того, вы можете проверить дополнительную ленивую загрузку или нетерпеливую загрузку, оба подхода избегают дополнительных запросов sql для связанных сущностей, когда вас просто интересует количество   -  person LBA    schedule 17.12.2018


Ответы (1)


Вот как я это исправил:

Переопределение renderTemplate в настраиваемом AdminController:

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;

}
person Oli    schedule 17.12.2018