Symfony 4 - Doctrine объект выборки DQL не работает - PullRequest
0 голосов
/ 04 ноября 2019

У меня проблема с DQL-запросом в Symfony. На самом деле у меня есть сущность Отсутствие, и в хранилище я хочу вернуть все отсутствия, сгруппированные по типу отсутствия.

Например, у нас будет:

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")

, у меня все пропуски, но вдруг она не сгруппирована. Так что в текущем состоянии я получаю это. Таким образом, в атрибуте «отсутствий» он ставит меня только первым, кого он находит и который соответствует, но он не упоминает всех других, которые также являются его частью.

enter image description here

1 Ответ

0 голосов
/ 04 ноября 2019

Я думаю, что вы неправильно понимаете использование 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;
    }
}
...