首页 > 解决方案 > 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
        )

)

标签: phpsymfonydoctrine

解决方案


从我的评论:

我认为这是没有机会的,因为第一个选择是对象本身,第二个是另外选择的 stmt。如果 user_count 是您的对象的一个​​属性,这将起作用。

相反,您可以添加一个名为private $countUsersRole 实体的新属性,并使用 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


推荐阅读