Multiple where condition does not work o n the Laravel eloquent

Viewed 81

I am new to Laravel. I am writing an Eloquent query but it does not work.

the code is

 $stories = Stories::with(['user', 'comment'])
            ->where('blocked', 1)
            ->where('title', 'like', '%' . $request->title . '%')
            ->orWhere('story', 'like', '%' . $request->story . '%')
            ->orWhere('section', 'like', '%' . $request->section . '%')
            ->orWhere('tags', 'like', '%' . $request->tags . '%')
            ->orderBy('id', 'DESC')
            ->get();

but it returns with 'blocked', 0

How can I get the result with 'blocked', 1 as well as the Search value?

2 Answers

Since you need blocked with other fields where you should use advanced query

https://laravel.com/docs/8.x/queries#subquery-where-clauses

$stories = Stories::with(['user', 'comment'])
        ->where('blocked', 1)
        ->where(function($q) use ($request) {
                $q->where('title', 'like', '%' . $request->title . '%')
                  ->orWhere('story', 'like', '%' . $request->story . '%')
                  ->orWhere('section', 'like', '%' . $request->section . '%')
                  ->orWhere('tags', 'like', '%' . $request->tags . '%');  
        })->orderBy('id', 'DESC')->get();

You have an order of operations issue. Consider using this version:

$stories = Stories::with(['user', 'comment'])
    $query->where('blocked', 1)
    ->where(function($query) {
        $query->where('title', 'like', '%' . $request->title . '%')
            ->orWhere('story', 'like', '%' . $request->story . '%')
            ->orWhere('section', 'like', '%' . $request->section . '%')
            ->orWhere('tags', 'like', '%' . $request->tags . '%')
    })
->orderBy('id', 'desc')
->get();

Here is the raw query you currently running:

SELECT *
FROM stories
WHERE (blocked = 1 AND
      title LIKE ?) OR
      story LIKE ? OR
      section LIKE ? OR
      tags LIKE ?
ORDER BY id DESC;

Note carefully that I have included parentheses, as the query will actually be evaluted. Here is the version you really want, corresponding to the above Eloquent code:

SELECT *
FROM stories
WHERE blocked = 1 AND
      (title LIKE ? OR
      story LIKE ? OR
      section LIKE ? OR
      tags LIKE ?)
ORDER BY id DESC;
Related