'required', 'title' => 'required|max_length[255]', 'schedule' => 'required|in_list[daily,weekly,monthly,custom]', ]; // Get recurring tasks with categories public function getWithCategories($taskId = null) { $builder = $this->select('recurring_tasks.*, GROUP_CONCAT(categories.name) as category_names') ->join('recurring_task_categories', 'recurring_tasks.id = recurring_task_categories.recurring_task_id', 'left') ->join('categories', 'recurring_task_categories.category_id = categories.id', 'left') ->groupBy('recurring_tasks.id'); if ($taskId) { $builder->where('recurring_tasks.id', $taskId); } return $builder->get()->getResultArray(); } // Get recurring tasks by user with categories public function getByUserWithCategories($userId) { return $this->select('recurring_tasks.*, GROUP_CONCAT(categories.name) as category_names') ->join('recurring_task_categories', 'recurring_tasks.id = recurring_task_categories.recurring_task_id', 'left') ->join('categories', 'recurring_task_categories.category_id = categories.id', 'left') ->where('recurring_tasks.user_id', $userId) ->groupBy('recurring_tasks.id') ->get() ->getResultArray(); } }