Home > Back-end >  How to simplify Laravel Eloquent where clause?
How to simplify Laravel Eloquent where clause?

Time:10-09

The following example will give me all users that are older than $age and have the gender $gender:

public function get_users_older_than(int $age = null, string $gender = null) {
   $users = User::query()
               ->where('age', '>', $age)
               ->where('gender', $gender)
               ->get();

   return $users;
}

Is there a way to use the where clause only if age or gender is present in a more eloquent and shorter way then:

public function get_users_older_than(int $age = null, string $gender = null) {
   $users = User::query();

   if ($age) {
      $users = $users->where('age', '>', $age):
   }

   if ($gender) {
      $users = $users->where('gender', $gender):
   }

   $users = $users->get();

   return $users;
}

With that, I could avoid to create and use the extra function and just have one single arrow connected line of code.

CodePudding user response:

A shorter way to do that would be this:

$users = User::where(function ($q) use($age, $gender) {
    if ($age) {
        $q->where('age', '>', $age);
    }
    if ($gender) {
       $q->where('gender', $gender);
    }
    })->get();

But just so you know, shorter code does not guarantee more efficiency.

CodePudding user response:

There is also a conditional clauses function when.

Based on what you have, that could look like:

public function get_users_older_than(int $age = null, string $gender = null) {
    $users = User::query();

    $users->when($age, function ($query, $age) {
        $query->where('age', '>', $age);
    })->when($gender, function ($query, $gender) {
        $query->where('gender', $gender);
    })->get();

    return $users;
}
  • Related