Jesse Luke Orange
Jesse Luke Orange

Reputation: 1999

Eloquent query AND OR

I have a scenario in which I'm searching through a database using Eloquent in Laravel.

I have the following query:

$search = $request->get('q');

$users = User::where('username', 'like', '%' . $request->get('q') . '%')
            ->orWhere('displayName', 'like', '%' . $request->get('q') . '%')
            ->orWhere('email', 'like', '%' . $request->get('q') . '%')
            ->orWhere('role', 'like', '%' . $request->get('q') . '%')
            ->orWhere('department', 'like', '%' . $request->get('q') . '%')
            ->orWhere('location', 'like', '%' . $request->get('q') . '%')
            ->orWhere('directDialIn', 'like', '%' . $request->get('q') . '%')
            ->orWhere('mobileNumber', 'like', '%' . $request->get('q') . '%')->get();

and I have the following query scope:

/**
 * Scope a query by published
 */
public function scopePublished($query)
{
    return $query->where('published', 'open');
}

I want to use the query scope to only search open articles.

I know you can chain where like this: Article::where()->where()->where()->get()

I get a bit confused with the chaining but I want to say: search the article columns with a LIKE operator but only where an article is open.

Without sounding dense, is there an easy mindset to convert my RAW SQL thought into Eloquent queries?

In my head, it would be a base query looking for open articles and then a nested query that searches through each field.

Upvotes: 0

Views: 41

Answers (1)

Jonas Staudenmeir
Jonas Staudenmeir

Reputation: 25906

Use a nested where() constraint:

User::where(function($query) use($request) {
    $query->where('username', 'like', '%' . $request->get('q') . '%')
        ->orWhere('displayName', 'like', '%' . $request->get('q') . '%')
        [...]
})->published()->get();

Upvotes: 1

Related Questions