在 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);