Reputation: 33
I have a controller, which, depending on the URL 'request' parameter, returns a SQL query.
switch ($request->get('request')){
case '3dvideo':
$students = Student::orderBy('year', 'desc')->where('orientation', '3D')->inRandomOrder()->paginate(12);
break;
case '2d':
$students = Student::orderBy('year', 'desc')->where('orientation', '2D')->inRandomOrder()->paginate(12);
break;
case 'web':
$students = Student::orderBy('year', 'desc')->where('orientation', 'web')->inRandomOrder()->paginate(12);
break;
case 'all':
$students = Student::orderBy('year', 'desc')->inRandomOrder()->paginate(12);
break;
default:
$students = Student::orderBy('year', 'desc')->inRandomOrder()->paginate(12);
break;
}
Now I have a second parameter in my URL (year), and I do not know how to make that according to both parameters (if year exists), I return a SQL query like this :
$students = Student::orderBy('year', 'desc')->where('orientation', 'web')->where('year', 'MY-YEAR')->inRandomOrder()->paginate(12);
Thank you very much
Upvotes: 1
Views: 53
Reputation: 7252
Optimize query like that.
$query = Student::orderBy('year', 'desc')->inRandomOrder();
if($request->has('orientation')){
query->where('orientation',$request->get('orientation'));
}
if($request->has('year')){
query->where('year',$request->get('year'));
}
$student = $query->paginate(12);
Upvotes: 1
Reputation: 163978
You can do something like this:
$students = Student::query();
if (in_array($request->request, ['3dvideo', '2d', 'web'])) {
$students = $students->where('orientation', $request->request);
}
if ($request->has('year')) {
$sudents = $students->where('year', $request->year);
}
$students = $students->latest('year')->inRandomOrder()->paginate(12);
Upvotes: 1