Структура данных результата Doctrine Join

Используя этот запрос:

$qb = $this->createQueryBuilder('r');
$qb->leftJoin('r.users', 'u')
    ->addSelect('count(u.id) as user_count')
    ->groupBy('r.id');

Получаю набор результатов:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 45
                    [role_name] => ROLE_ADMIN
                    [description] => Admin roles
                )

            [user_count] => 1
        )

    [1] => Array
        (
            [0] => Array
                (
                    [id] => 47
                    [role_name] => ROLE_OPERATOR
                    [description] => Operator role
                )

            [user_count] => 1
        )

    [2] => Array
        (
            [0] => Array
                (
                    [id] => 48
                    [role_name] => ROLE_TEST
                    [description] => ROLE_TEST
                )

            [user_count] => 0
        )

)

Есть ли умный способ трансформировать все свойства на одном уровне? Поскольку теперь роли находятся в подмассиве с ключом 0.

Желаемый результат:

Array
(
    [0] => Array
        (
            [id] => 45
            [role_name] => ROLE_ADMIN
            [description] => Admin roles
            [user_count] => 1
        )

    [1] => Array
        (
            [id] => 47
            [role_name] => ROLE_OPERATOR
            [description] => Operator role
            [user_count] => 1
        )

    [2] => Array
        (
            [id] => 48
            [role_name] => ROLE_TEST
            [description] => ROLE_TEST
            [user_count] => 0
        )

)

Я думаю, что у этого нет шансов, потому что первый select - это сам объект, а второй - это дополнительно select stmt. Если бы user_count был атрибутом вашего объекта, это сработало бы.

Fabian Schmick 20.11.2018 14:00

Но я думаю, вы можете посчитать users на вашем объекте $role, если у вас есть метод ->getUsers() в вашем классе Role?

Fabian Schmick 20.11.2018 14:02

@Fabian, да, в сущности есть метод Role::getUser(). Как мне в этом случае добавить счетчик к набору результатов?

Roman Newaza 20.11.2018 14:06

Например, реализуйте метод под названием getCountUsers(), там вы можете return count(self::getUser());

Fabian Schmick 20.11.2018 14:09

Ну да, это ясно, но означает ли это, что мне нужно вызвать цикл getCountUsers() через набор результатов?

Roman Newaza 20.11.2018 14:12

да. Или вы можете создать новый атрибут в сущности своей роли с именем private $countUsers и использовать symfony.com/doc/current/doctrine/lifecycle_callbacks.html, чтобы установить это значение на postLoad .

Fabian Schmick 20.11.2018 14:15

Хороший! Мне нравится более позднее решение! Спасибо! Пожалуйста, добавьте это как ответ, чтобы я мог принять его

Roman Newaza 20.11.2018 14:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из моего комментария:

I think there is no chance to this, because the first select is the object itselfs and the second is an additionally select stmt. If user_count would be an attribute of your object this would work.

Вместо этого вы можете добавить новый атрибут с именем private $countUsers в сущность своей роли и установить его значение с помощью события Doctrine LifecycleCallbacks PostLoad.

Реализация Symfony: https://symfony.com/doc/current/doctrine/lifecycle_callbacks.html

События доктрины: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html#lifecycle-events

Возможно ли, чтобы это $ countUsers не было добавлено в схему?

Roman Newaza 20.11.2018 14:29

Да, не помещайте над ним какие-либо соответствующие примечания к доктрине

Fabian Schmick 20.11.2018 14:30

Да, понял. Спасибо!

Roman Newaza 20.11.2018 14:32

Другие вопросы по теме