Rp9
Rp9

Reputation: 1963

Laravel conditional clause when for filtering value

I have a event table with status o or 1.

I have to filter the event with status 1,0 or ALL.

I tried with laravel when conditional clause,its not working with value zero,other conditionals are working.

$status    = Input::get('status');
$events    = DB::table('events')
          ->select('events.*')
          ->when($status, function ($query) use ($status) {
           return $query->where("events.status",$status);
           })
          ->get();

Upvotes: 3

Views: 3527

Answers (2)

Gul Muhammad
Gul Muhammad

Reputation: 176

For any future reader using 0 and 1

we can use when in the following way

->when($request->has('status'),
fn ($query) => $query->where("status", $request->status)
)->get();

we are getting the user requested status using has method in Laravel to deal with it.

Upvotes: 0

Jignesh Joisar
Jignesh Joisar

Reputation: 15115

in_array function used in when method try this one

because 0(zero) means(false) by default understand so try to use inner function in when method

if didn't pass status then set default value as 2 or any number but not 0,1 and null

$status  = Input::has('status') ? Input::get('status') : 2;

$events  = DB::table('events')->select('events.*')
          ->when(in_array($status,[0,1]), function ($query) use ($status) {
                return $query->where("events.status",$status);
           })->get();

second way create a new function

   function checkStatus($status,$array) {
       if(isset($status)) {
           return in_array($status,$array);
      }

      return false;
    }



$events  = DB::table('events')->select('events.*')
                  ->when(checkStatus($status,[0,1]), function ($query) use ($status) {
                        return $query->where("events.status",$status);
                   })->get();

Upvotes: 3

Related Questions