Josué Lamah
Josué Lamah

Reputation: 33

How do I change the sql query dynamically in this case?

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

Answers (2)

Shailesh Ladumor
Shailesh Ladumor

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

Alexey Mezenin
Alexey Mezenin

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

Related Questions