timeEntryRepository->createQueryBuilder('te') ->leftJoin('te.user', 'u')->addSelect('u') ->leftJoin('te.project', 'p')->addSelect('p') ->leftJoin('te.task', 't')->addSelect('t') ->leftJoin('te.tags', 'tg')->addSelect('tg') ->orderBy('te.startedAt', 'DESC') ->setMaxResults($limit) ; if (null !== $userId) { $qb->andWhere('u.id = :userId')->setParameter('userId', $userId); } if (null !== $projectId) { $qb->andWhere('p.id = :projectId')->setParameter('projectId', $projectId); } if (null !== $taskId) { $qb->andWhere('t.id = :taskId')->setParameter('taskId', $taskId); } if (null !== $startDate) { $qb->andWhere('te.startedAt >= :startDate') ->setParameter('startDate', new DateTimeImmutable($startDate.' 00:00:00')) ; } if (null !== $endDate) { $qb->andWhere('te.startedAt <= :endDate') ->setParameter('endDate', new DateTimeImmutable($endDate.' 23:59:59')) ; } $entries = $qb->getQuery()->getResult(); return json_encode(array_map(fn ($entry) => [ 'id' => $entry->getId(), 'title' => $entry->getTitle(), 'description' => $entry->getDescription(), 'startedAt' => $entry->getStartedAt()?->format('c'), 'stoppedAt' => $entry->getStoppedAt()?->format('c'), 'duration' => $entry->getStoppedAt() && $entry->getStartedAt() ? (int) round(($entry->getStoppedAt()->getTimestamp() - $entry->getStartedAt()->getTimestamp()) / 60) : null, 'user' => [ 'id' => $entry->getUser()->getId(), 'username' => $entry->getUser()->getUsername(), ], 'project' => $entry->getProject() ? [ 'id' => $entry->getProject()->getId(), 'code' => $entry->getProject()->getCode(), 'name' => $entry->getProject()->getName(), ] : null, 'task' => $entry->getTask() ? [ 'id' => $entry->getTask()->getId(), 'number' => $entry->getTask()->getNumber(), 'title' => $entry->getTask()->getTitle(), ] : null, 'tags' => $entry->getTags()->map(fn ($t) => [ 'id' => $t->getId(), 'label' => $t->getLabel(), ])->toArray(), ], $entries)); } }