sveti petar
sveti petar

Reputation: 3797

orWhere with multiple conditions in Eloquent

I am looking to write the following query in eloquent:

select * from stocks where (symbol like '%$str%' AND symbol != '$str' ) OR name like '$str%'

Without the last condition, it's simple:

$stocks = Stock::live()
        ->where('symbol','like','%'.$str.'%')
        ->where('symbol','!=',$str)
        ->get();

But adding orWhere('name','like',$str.'%') after the two wheres returns incorrect results. Basically I am wondering how to emulate what I accomplished by using the (condition1 AND condition2) OR condition3 syntax in the raw query above.

Upvotes: 2

Views: 3140

Answers (3)

pseudoanime
pseudoanime

Reputation: 1593

Try

$stocks = Stock::live()
           ->where('name', 'like' , '%'.$str.'%')
           ->orWhere(function($query) use($str) {
                $query->where('symbol','like','%'.$str.'%')
                      ->where('symbol','!=',$str); // corrected syntax 
           })->get();

Upvotes: 3

Hung Nguyen
Hung Nguyen

Reputation: 61

I didn't test this, so sorry if it doesn't work. But I think one of these solutions could work.

$stocks = Stock::live()
        ->where([
            ['symbol','like','%'.$str.'%'],
            ['symbol', '!=', $str],
        ])
        ->orWhere('name','like', $str.'%')
        ->get();

and

->where(function ($query) use ($str) {
    $query->where([
            ['symbol','like','%'.$str.'%'],
            ['symbol', '!=', $str],
        ]);
})
->orWhere(function ($query) use ($str) {
    $query->where('name','like', $str.'%');
});

Upvotes: -1

Parth Shah
Parth Shah

Reputation: 411

Try

$stocks = Stock::live()->where('name', 'like' , '%'.$str.'%')
           ->orWhere(function($query) use($str) {
                $query->where('symbol','like','%'.$str.'%')
                      ->where('symbol','!=',$str) 
           })->get();

Upvotes: 0

Related Questions