Используя этот запрос:
$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
)
)
Но я думаю, вы можете посчитать users на вашем объекте $role, если у вас есть метод ->getUsers() в вашем классе Role?
@Fabian, да, в сущности есть метод Role::getUser(). Как мне в этом случае добавить счетчик к набору результатов?
Например, реализуйте метод под названием getCountUsers(), там вы можете return count(self::getUser());
Ну да, это ясно, но означает ли это, что мне нужно вызвать цикл getCountUsers() через набор результатов?
да. Или вы можете создать новый атрибут в сущности своей роли с именем private $countUsers и использовать symfony.com/doc/current/doctrine/lifecycle_callbacks.html, чтобы установить это значение на postLoad .
Хороший! Мне нравится более позднее решение! Спасибо! Пожалуйста, добавьте это как ответ, чтобы я мог принять его






Из моего комментария:
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 не было добавлено в схему?
Да, не помещайте над ним какие-либо соответствующие примечания к доктрине
Да, понял. Спасибо!
Я думаю, что у этого нет шансов, потому что первый select - это сам объект, а второй - это дополнительно select stmt. Если бы
user_countбыл атрибутом вашего объекта, это сработало бы.