Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Eloquent - How to group conditions

I'm using the following eloquent statement

Title::where('word', 'lovers')
    ->orWhere('word', 'lover')
    ->where('domain', $resultFromFirstKeyword->domain)
    ->get();

Which I can see through the SQL logger produces the following SQL

SELECT * FROM `title` 
WHERE `word` = 'lovers' 
OR `word` = 'lover' 
AND `domain` = 'www.texasbirdlovers.com'

However the SQL that I would like to produce is

SELECT * FROM `title` 
WHERE (`word` = 'lovers' OR `word` = 'lover') 
AND `domain` = 'www.texasbirdlovers.com'

How would I achieve this?

like image 258
Mr J Avatar asked Apr 25 '18 10:04

Mr J


4 Answers

This should work:

Title::whereIn('word', ['lovers', 'lover'])
    ->where('domain', $resultFromFirstKeyword->domain)
    ->get();

If, however, you want to combine them exactly like you said, try this:

Title::where(function($query) {
        $query->where('word', 'lovers')
            ->orWhere('word', 'lover');
    })
    ->where('domain', $resultFromFirstKeyword->domain)
    ->get();
like image 164
Tudor Avatar answered Nov 18 '22 10:11

Tudor


Just group your query in a where clause

Title::where(function($q){
         $q->where('word', 'lovers')->orWhere('word', 'lover');
 })->where('domain', $resultFromFirstKeyword->domain)->get();
like image 26
Sohel0415 Avatar answered Nov 18 '22 10:11

Sohel0415


Try

Title::where('domain', $resultFromFirstKeyword->domain)
    ->where(function($query) {
        return $query
            ->where('word', '=', 'lovers')
            ->orWhere('word', '=', 'word');
    })->get();
like image 1
Nirali Avatar answered Nov 18 '22 11:11

Nirali


Try the following:

Title::where(function($query) {
    return $query
        ->where('word', 'lover')
        ->orWhere('word', 'lovers');
})
->where('domain', $resultFromFirstKeyword->domain)
->get();
like image 1
SuperDJ Avatar answered Nov 18 '22 11:11

SuperDJ