Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Starting Query Builder without using a query

So, I can use User::where('username', '!=', null)->get();

However, I am in a case where I want to chain queries using if conditions starting from the first one, and where('username', '!=', null) is unnecessary in this case. Let me give a pseudo example:

I am running a report based on Users where there are several fields. I want to initialize the query builder like this, and chain queries using if statements.

$user = User::class();   // I know I can't use this line, however you'll get the idea.

if (isset($gender)) {
   $user = $user->where('gender', $gender);
}

if (isset($age)) {
   $user = $user->where('age', $age);
}

$users = $user->get()

Is the only way starting the query (in the first line) with:

$user = User::where('username', '!=', null)
like image 883
senty Avatar asked Jul 22 '26 10:07

senty


2 Answers

You're looking for

$userQuery = User::query();

Then, tack on some additional clauses:

$userQuery->where(...);

Then, provide a closure (->first(), ->get(), etc) to get your users:

$users = $userQuery->get();
like image 63
Tim Lewis Avatar answered Jul 24 '26 05:07

Tim Lewis


You could instantiate your object like :

$user = (new User);

NOTE: However it will be better to use when() instead of the if statements.

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

If the variables are not initialized you could use isset() method like :

$users = User::when( isset($gender), function ($query, $gender) {
    $query->where('gender', $gender);
})
->when( isset($age), function ($query, $age) {
    $query->where('age', $age);
})
->get();
like image 31
Zakaria Acharki Avatar answered Jul 24 '26 04:07

Zakaria Acharki



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!