首页 > 解决方案 > Symfony 4 - Doctrine DQL 选择集合对象不起作用

问题描述

我对 Symfony 上的 DQL 查询有疑问。事实上,我有一个实体缺勤,在存储库中我想返回所有缺勤,按缺勤类型分组。

例如,我们将有:

0 => array:2
    "absences" => Collection(or array, with all Absences objects)
    "type" => "Heures supp"
1 => array:2
    "absences" => Collection(or array, with all Absences objects)
    "type" => "RTT"
...

所以我做了我的功能:

public function getAbsencesValidees($user)
    {
        return $this->createQueryBuilder("a")
            ->select("a as absences, t.nom as type")
            ->join("a.typeConge", "t")
            ->where("a.user = :user")
            ->andWhere("a.etat = 'Validée'")
            ->groupBy("t.nom")
            ->setParameter("user", $user)
            ->getQuery()
            ->getResult();
    }

但是突然在属性“缺席”中,他只把我放在了第一个对象。他并没有把我所有的缺席都与那个家伙有关。但是,如果我撤回参考

->groupBy("t.nom")

好吧,我有所有的缺勤,但突然它没有分组所以在目前的情况下,我明白了。因此,在“缺席”属性中,他只将我放在他找到并对应的第一个,但他没有提到所有其他人也是其中的一部分。

在此处输入图像描述

标签: arrayssymfonycollectionsdoctrinedql

解决方案


我想你误解了groupBy().
对于你想做的事情,你不需要groupBy().

首先,您的查询:

public function getUserAbsences(User $user) {
    $qb=$this->createQueryBuilder("absence");

    $qb->addSelect("partial typeConge.{id, nom}")
       ->join("absence.typeConge", "typeConge")
       ->andWhere("absence.user = :user")
       ->andWhere("absence.etat = 'Validée'")
       ->setParameter("user", $user);

    return $qb->getQuery()->getResult();
}

现在,SQL 结果不是一个多维数组,所以在你的控制器中,你必须过滤这个结果。

public function userAbsences(AbsenceRepository $absenceRepository) {
    $absencesByType=array();
    $absences=$absenceRepository->getUserAbsences($this->getUser());

    foreach($absences as $absence) {
        $absencesByType[$absence->getTypeConge->getNom][]=$absence;
    }
}

推荐阅读