在 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
written by
sharkHead

後端工程師, PHP 基金會每月 5 鎂小額贊助人 稍微擅長 PHP、Python 與 Google Search,偶爾寫寫 TypeScript 對於逗號後面必須加空格有著絕對的堅持