0

抱歉,如果问题措辞不当,我想不出一个好的方法来描述我的问题。

所以基本上,我正在使用 Doctrine 查询构建器来尝试从我的Session实体中获取培训课程列表。对于每个session,我需要获取名称和日期等基本属性,但我还需要获取participants. Session实体和之间存在一对多的关系,因为给定的Participant可能有多个。我只需要一个列表,嵌套在列表的每个项目中。像这样的东西:participantssessionparticipantssessions

[
    {
        "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",

                ...
            },

            ...
        ],
    },

    ...
]

在我看来,这应该是非常基本的,但是对于我的生活,我无法让它与JOINs、子查询等一起使用。我得到的最接近的是这个错误,这确实意味着我正在尝试获取一个嵌套数组(但它不会让我):

SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row

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

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

我知道我可以获取我的sessions,然后遍历它们并使用另一个 DQL 查询获取他们的参与者,但显然这似乎不是正确的方法。有没有更好的办法?

4

1 回答 1

0

你可以直接leftJoin在你的QueryBuilder

$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()
;
于 2020-10-15T17:28:01.947 回答