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

程式技術
sharkHead

有時候在撈取資料表資料的時候,因為 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,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言