Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to combine WHERE clauses in Eloquent

I would like to have this kind of query in Eloquent:

SELECT * FROM table WHERE status = 1 AND (type = 2 OR type = 3 OR type = 4)

I've been unable to find an easy way of doing this in Eloquent. If I use

Table::where('status', 1)->orWhere('type', 2)->orWhere('type', 3)...

This this translates to:

SELECT * FROM table WHERE status = 1 OR type = 2 OR type = 3 OR type = 4

Which is not what I need. Creating a query scope for 'status = 1' also gets me the same results. How can I run this query in Eloquent?

like image 378
User402841 Avatar asked Aug 15 '16 04:08

User402841


3 Answers

To group where clauses like that, you need to pass a closure to the where() method, and add your grouped conditions inside the closure. So, your code would look something like:

Table::where('status', 1)->where(function ($q) {
    return $q->where('type', 2)->orWhere('type', 3)->orWhere('type', 4);
});

This will generate the SQL:

SELECT * FROM tables WHERE status = 1 AND (type = 2 OR type = 3 OR type = 4)
like image 182
patricus Avatar answered Nov 10 '22 07:11

patricus


Eloquent allows nested parameter groupings passing a Closure as the argument of where, orWhere, or the undocumented but more expressive whereNested:

Table::where('status', 1)
    ->whereNested(function ($query) {
        $query->where('type', 2)
              ->orWhere('type', 3)
              ->orWhere('type', 4);
    });
like image 38
whoan Avatar answered Nov 10 '22 05:11

whoan


you can try parameter grouping in where to achieve what you want.

Table::where('status', 1)->where(function ($query) {
            $query->where('type', 2)
                  ->orWhere('type', 3)
                  ->orWhere('type',4);})

For more info check laravel Query builder documentation.

like image 32
Ravi Shankar Bharti Avatar answered Nov 10 '22 05:11

Ravi Shankar Bharti