SUB0DH
SUB0DH

Reputation: 5240

Combining AND/OR eloquent query in Laravel

How can I write following or similar kind of queries using Eloquent?

SELECT * FROM a_table WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1 AND d = 5

I couldn't combine AND/OR in the way I wanted by chaining where & or_where functions.

Upvotes: 22

Views: 26415

Answers (4)

Kornel
Kornel

Reputation: 4294

In Laravel 5.1+ this will also do the job and looks cleaner:

Model::where(function($query) {
    $query->where('a', 'like', 'keyword');
    $query->or_where('b', 'like', 'keyword');
})->where('c', '=', '1')->get();

Upvotes: 4

aowie1
aowie1

Reputation: 846

For a more accurate answer to the example:

$val = '%keyword%';

A_Table_Model::where(function($query) use ($val)
{
    $query->where('a', 'like', $val);
    $query->or_where('b', 'like', $val);
})
->where('c', '=', 1)
->where('d', '=', 5)
->get();

Note: This is Laravel 3 syntax, use camelCase orWhere() for Laravel 4

Upvotes: 10

Florent Poujol
Florent Poujol

Reputation: 740

You can nest where clauses : http://laravel.com/docs/database/fluent#nested-where

Model::where(function($query)
{
    $query->where('a', 'like', 'keyword');
    $query->or_where('b', 'like', 'keyword');
})
->where('c', '=', '1');

This should produce : SELECT * FROM models WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1

Upvotes: 55

Rob Gordijn
Rob Gordijn

Reputation: 6511

You can use DB::raw() in the first where() to put in the like/or statement.

Upvotes: -3

Related Questions