$dto->user->getId(), 'set_name' => $dto->setName, 'element_kind' => $dto->elementKind, 'start_date' => $dto->startDate->format('Y-m-d'), 'target_date' => $dto->targetDate->format('Y-m-d'), ]); foreach ($dto->assignments as $assignmentDto) { ScheduleAssignmentModel::create([ 'schedule_id' => $model->id, 'element_name' => $assignmentDto->name, 'element_kind' => $assignmentDto->kind, 'element_path' => $assignmentDto->path, 'scheduled_date' => $assignmentDto->scheduledDate ->format('Y-m-d'), 'position' => $assignmentDto->position, ]); } return $this->toDomain($model, $dto->user); }); } public function findForUser(int $id, User $user): ?Schedule { $model = ScheduleModel::query() ->where('id', $id) ->where('user_id', $user->getId()) ->first(); return $model === null ? null : $this->toDomain($model, $user); } public function findAllForUser(User $user): array { $models = ScheduleModel::query() ->where('user_id', $user->getId()) ->orderByDesc('id') ->get(); $schedules = []; foreach ($models as $model) { $schedules[] = $this->toDomain($model, $user); } return $schedules; } private function toDomain(ScheduleModel $model, User $user): Schedule { $assignmentModels = ScheduleAssignmentModel::query() ->where('schedule_id', $model->id) ->orderBy('position') ->orderBy('id') ->get(); $assignments = []; foreach ($assignmentModels as $assignmentModel) { $assignments[] = new ScheduleAssignment( id: $assignmentModel->id, name: $assignmentModel->element_name, kind: $assignmentModel->element_kind, path: $assignmentModel->element_path, scheduledDate: $this->date($assignmentModel->scheduled_date), position: $assignmentModel->position, ); } return new Schedule( id: $model->id, user: $user, setName: $model->set_name, elementKind: $model->element_kind, startDate: $this->date($model->start_date), targetDate: $this->date($model->target_date), assignments: $assignments, ); } private function date(string $value): DateTimeImmutable { return new DateTimeImmutable($value, new DateTimeZone('UTC')); } }