Level 104
I believe it might be more appropriate to return a Builder instance from the model:
// Model
public function listCourses()
{
return static::select('course.course_id', 'course.course_title', 'course.course_overview', 'category.category_name', 'course_level.course_difficulty')
->join('category', 'course.category_id', '=', 'category.category_id')
->join('course_level', 'course.course_level_id', '=', 'course_level.course_level_id')
}
and use it in the controller as a Builder instance to modify the query as required:
public function listCourses(Request $r)
{
$sortOrder = $r->get('sort') == 'a' ? 'asc' : 'desc';
$category_id = $r->get('category_id');
/** @var Illuminate\Database\Eloquent\Builder $builder */
$builder = $this->course_discovery->listCourses();
$builder->orderBy('category.category_name', $sortOrder)
->orderBy('course.course_title', $sortOrder);
}
// Now chain your filters *if* there is a value, for example:
$builder->when($category_id, function ($query) use ($category_id) {
$query->where('category_id', $category_id);
});
return response()->json([
'Result' => $builder->paginate(10) // finish your query
]);
}
This could be optimised further using local query scopes on the model, but you get the idea
1 like