Doctrine 我可以直接在我的条令结果中得到嵌套列表吗?

Doctrine 我可以直接在我的条令结果中得到嵌套列表吗?,doctrine,php-7,dql,symfony-4.4,Doctrine,Php 7,Dql,Symfony 4.4,对不起,如果这个问题措辞不当,我想不出一个好的方式来描述我的问题 因此,基本上,我正在使用条令查询生成器尝试从我的会话实体创建一个培训会话列表。对于每个会话,我需要获取基本属性,如姓名和日期,但我还需要获取参与者的列表。实体会话和参与者之间存在一对多关系,因为给定的会话可能有多个参与者。我只需要这些参与者的列表,嵌套在会话列表的每个项目中。大概是这样的: [ { "session_name": "name1", &q

对不起,如果这个问题措辞不当,我想不出一个好的方式来描述我的问题

因此,基本上,我正在使用条令查询生成器尝试从我的
会话
实体创建一个培训会话列表。对于每个
会话
,我需要获取基本属性,如姓名和日期,但我还需要获取
参与者的列表
。实体
会话
参与者
之间存在一对多关系,因为给定的
会话
可能有多个
参与者
。我只需要这些
参与者的列表
,嵌套在
会话列表的每个项目中
。大概是这样的:

[
    {
        "session_name": "name1",
        "session_date": "date1",

        ...

        "participants": [
            {
                "participant_name": "john1",

                ...
            },
            {
                "participant_name": "john2",

                ...
            },

            ...
        ],
    },
    {
        "session_name": "name2",
        "session_date": "date2",

        ...

        "participants": [
            {
                "participant_name": "john3",

                ...
            },
            {
                "participant_name": "john4",

                ...
            },

            ...
        ],
    },

    ...
]
在我看来,这应该是非常基本的,但就我的一生而言,我无法让它处理
连接
s、子查询等。我得到的最接近的错误是这个错误,这确实意味着我正在尝试获取嵌套数组(但它不允许我):

运行此代码时出现以下错误:

$query = $this->createQueryBuilder('s')
    ->select('
        s.name,
        s.date,
        (SELECT p.nom FROM '.Participant::class.' p WHERE p.session = s.id) participants
    ')
    ->getQuery()->getArrayResult();

我知道我可以只获取我的
会话
,然后通过另一个DQL查询循环它们并获取参与者,但显然这似乎不是正确的方法。有更好的方法吗?

您可以在
QueryBuilder
上直接执行
leftJoin

$queryResult = $this->createQueryBuilder('s')

    // After that next line, you can reference participants as 'p'
    ->leftJoin('s.participants', 'p')

    // If you intend to loop on the result, to avoid the N+1 problem, add this line :
    ->addSelect('p')

    ->getQuery()
    ->getResult()
;

我已经尝试了
addSelect()
,如果我之前已经使用了
select()
,它就不会有任何效果。在我看来,我只需要使用
addSelect()
,它不允许我选择要获取或不获取哪些字段。这里我只需要
参与者的名字和姓氏,因此我不希望获取与我的情况无关的每个字段(例如他们的电话号码、地址等)。您需要数组而不是对象的原因是什么?
$queryResult = $this->createQueryBuilder('s')

    // After that next line, you can reference participants as 'p'
    ->leftJoin('s.participants', 'p')

    // If you intend to loop on the result, to avoid the N+1 problem, add this line :
    ->addSelect('p')

    ->getQuery()
    ->getResult()
;