在 Laravel ORM 中,使用 AND 與 OR 組合 WHERE 條件的小技巧

有時候在撈取資料表資料的時候,因為 WHERE 條件較為複雜
可能需要使用多個 AND 或是 OR 才能撈取到我們想要的資料

假設我們的 WHERE 過濾條件如下

WHERE ('sex' = 'male' AND age > 18) OR ('sex' = 'female' AND age > 22);

如果使用 Laravel ORM 來寫上述的過濾條件,有人可能會這麼寫

$query->where('sex', 'male');
$query->where('age', '>', 18);
$query->orWhere('sex', 'female');
$query->where('age', '>', 22);

但如果用 toSql() 查看產出後的 SQL 查詢語句,你會發現過濾條件似乎不太一樣

WHERE sex = 'male' AND age > 18 OR sex = 'female' AND age > 22;

補上括號來看,就會了解搜尋條件與原本想要的條件有差距

WHERE (((sex = 'male' AND age > 18) OR sex = 'female') AND age > 22);

正確的做法,是在 where() 中使用閉包

$query->where(function ($query) {
    $query->where('sex', 'male')
        ->where('age', '>', 18);
});

$query->orWhere(function ($query) {
    $query->where('sex', 'female')
        ->where('age', '>', 22);
});

如此一來,才能得到正確的過濾條件

WHERE ('sex' = 'male' AND age > 18) OR ('sex' = 'female' AND age > 22);

 

參考資料
AND-OR-AND + brackets with Eloquent
Laravel 官方文件

sharkHead 後端工程師,稍微擅長 Laravel、Python 與 Google
對於前端有興趣,無奈沒什麼慧根