【问题标题】:Get flat array when making mutliple selects in Doctrine在 Doctrine 中进行多项选择时获取平面数组
【发布时间】:2018-04-26 15:52:52
【问题描述】:

我有一个查询,它从一个表中获取一些信息 AND 从另一个表中获取相关对象的计数。我无法用 DQL 表达它,所以它会返回一个 平面数组

此示例获取学校、学校名称和每个学校的学生人数:

$qB = $this->createQueryBuilder('school')
$qB->leftJoin('school.students', 'students');
$qB->select([
    'partial school.{id, name}',
    'count(students) AS number_students',
]);
$qB->groupBy('school');
$qB->getQuery()->getResult();

我期待它返回:

[
    [id => 1, 'name' => 'School A', 'number_students' => 5],
    [id => 2, 'name' => 'School B', 'number_students' => 3],
]

但我最终得到了这个:

[
    [0 => [id => 1, 'name' => 'School A'], 'number_students' => 5],
    [0 => [id => 2, 'name' => 'School B'], 'number_students' => 3],
]

作为一种解决方法,可以使用$qB->getQuery()->getScalarResult(),但这会转换变量名称(例如,实体变量名称schoolName 然后转换为数据库中的列标题school_name),这意味着我会必须重新映射字段。

这可能与 Doctrine 对待实体的方式有关。这是示例的学校实体:

class School {
    protected $id;
    protected $name;
    protected $students;
}

【问题讨论】:

    标签: php doctrine-orm dql doctrine-query


    【解决方案1】:

    从上面的 DQL 看来,您最终得到的结果好坏参半,这是使用 $qB->getQuery()->getResult() 时的 Doctrine 默认行为。

    SELECT u, p.quantity FROM Users u...

    在这里,结果将再次是一个数组数组,其中每个元素 是一个由用户对象和标量值组成的数组 p.数量。

    我会尝试调试生成的 SQL,如果我是对的,那么这就是你的原因。恕我直言,这种行为无法改变,但也许我错了。

    在这种情况下,解决方案可能是编写一个protected PHP 函数,用于根据需要展平数组。

    更新:

    我没有尝试过,但似乎可以使用Doctrine Events 来实现这一点。 preSelectpostSelect 没有内置事件,但是您可以创建自己的事件并正确注册它,以便您可以随时调用它。如前所述,我没有尝试过,我完全不确定这是否可以使用任何事件(我可能错了)。

    只是一个旁注,我不会试图过度复杂化这件事,当你可以通过创建一个可以在任何一点。

    更多信息:

    【讨论】:

    • 我想知道是否可以修改实体,以便 Doctrine 将这些字段添加到主数组中。
    • 我已经更新了我的答案,看看我发现了什么并在那里思考:)
    • 好主意,谢谢。但确实,私有方法可能是更好的方法,也适用于调试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2013-12-21
    • 2021-05-28
    • 1970-01-01
    • 2011-03-22
    • 2017-06-22
    相关资源
    最近更新 更多