Как добавить результат подзапроса в Sonata Admin List View? - PullRequest
0 голосов
/ 30 марта 2019

Я ищу наиболее эффективный способ добавить результат подзапроса в виде столбца в ListMapper.

У меня есть метод хранилища, такой как:

    public function getAdminQueryBuilder()
    {
        return $this->createQueryBuilder('city')
            ->select('city, 
                (SELECT COUNT(DISTINCT si.jobSeekerUser)
                FROM App:City\JobTitle jt LEFT JOIN jt.submittedJobTitleInterests si
                WHERE si.jobTitle = jt AND jt.city = c)  AS cntInterestedUser 
            ')
        ;
    }

Так как вывидите, я хочу добавить новое скалярное значение "cntInterestedUser" в каждую строку вместе с обычными значениями из объекта City.

В классе администратора у меня есть:

    public function createQuery($context = 'list')
    {
        $repository = $this->modelManager->getEntityManager($this->getClass())->getRepository($this->getClass());
        $query = new ProxyQuery($repository->getAdminQueryBuilder());

        foreach ($this->extensions as $extension) {
            $extension->configureQuery($this, $query, $context);
        }

        return $query;
    }

, а затемв методе listMapper у меня есть:

->add('cntInterestedUser')

Но при загрузке я получаю исключение:

"An exception has been thrown during the rendering of a template ("Warning: Illegal offset type in isset or empty")."

, которое указывает на строку 12 base_list_field.html.twig, котораяимеет:

<td class="sonata-ba-list-field sonata-ba-list-field-{{ field_description.type }}" objectId="{{ admin.id(object) }}"{% if field_description.options.row_align is defined %} style="text-align:{{ field_description.options.row_align }}"{% endif %}>

Я уже реализовал другие решения, такие как пользовательский метод в City, который зацикливает связанные коллекции и суммирует количество ... но это крайне неэффективно по отношению к разрешениючисло баз данных.

Я также реализовал прослушиватель событий PostLoad, который выполняет работу довольно эффективно, но при этом генерирует один дополнительный запрос на строку ... и также выполняет этот дополнительный запрос каждый раз, когда загружается Город ... гдеДействительно, я хочу получить это дополнительное значение только в контексте Sonata Admin.

Итак ... возможно ли вообще добавить пользовательский столбец с помощью подзапроса и сделать его доступным в объекте City и List Mapper?Я пропускаю шаг в правильном увлажнении "cntInterestedUser", чтобы сделать его доступным для listMapper?

...