"assign", "finished_by" => "finished_by", default => "requirement_id" }; $groupTasks = $project->tasks()->with(['assignTo'])->get()->groupBy($groupKey); $statusItems = array_column(ProjectStatus::cases(), 'value'); $items = []; $groupIds = []; foreach ($groupTasks as $groupId => $tasks) { $groupItems = []; foreach ($statusItems as $status) { $groupItems[$status] = []; } foreach ($tasks as $task) { $groupItems[$task->status][] = new KanbanTaskResource($task); } $items[$groupId ?: "empty"] = $groupItems; $groupIds[] = $groupId; } return [ 'group_data' => $this->getKanbanGroupData($groupIds, $group), 'group' => $group, 'tasks' => $items, 'status_items' => $statusItems, ]; } protected function getKanbanGroupData(array $ids, string $group) { $orderBy = match ($group) { "requirement_asc" => ['id', 'asc'], "requirement_desc" => ['id', 'desc'], "requirement_priority_asc" => ['priority', 'asc'], "requirement_priority_desc" => ['priority', 'desc'], default => null }; return match ($group) { "assign", "finished_by" => UserProfileResource::collection(User::query()->whereIn("id", $ids)->get()), default => Requirement::query()->whereIn("id", $ids) ->when($orderBy, fn($query) => $query->orderBy(...$orderBy)) ->get([ 'id', 'title', 'priority', 'status' ]), }; } }