laravel - 如何设置双级深度或 where 子句
问题描述
我的查询目前是这样的:
$erwachsene = $search_data['erwachsene'];
$kinder = $search_data['kinder'];
$rooms = Room::select('rooms.*')
->where('hotel_id', '=', $id)
->where('room_status', '=', 1)
->where(function($query) use ($erwachsene, $kinder) {
$query->where("occupancy_adults1", ">=", $erwachsene);
$query->where("occupancy_childs1", ">=", $kinder);
})
->orWhere(function($query) use ($erwachsene, $kinder) {
$query->where("occupancy_adults2", ">=", $erwachsene);
$query->where("occupancy_childs2", ">=", $kinder);
})
->get();
这个返回查询是这样的:
SELECT `rooms`.*
FROM `rooms`
WHERE `hotel_id` = ?
AND `room_status` = ?
AND ( `occupancy_adults1` >= ?
AND `occupancy_childs1` >= ? )
OR ( `occupancy_adults2` >= ?
AND `occupancy_childs2` >= ? )
我需要将最后一个 AND 和 OR 子句放在 OR 组下:
SELECT `rooms`.*
FROM `rooms`
WHERE `hotel_id` = ?
AND `room_status` = ?
AND
(
( `occupancy_adults1` >= ? AND `occupancy_childs1` >= ? )
OR ( `occupancy_adults2` >= ? AND `occupancy_childs2` >= ? )
)
例如,多一级括号。Eloquent
功能可以吗?
解决方案
您必须级联您的 where 调用以获得预期的 SQL:
// ...
->where(function($query) use ($erwachsene, $kinder) { // (
$query->where(function($query) use ($erwachsene, $kinder) { // (
$query->where("occupancy_adults1", ">=", $erwachsene); // `occupancy_adults1` >= ?
$query->where("occupancy_childs1", ">=", $kinder); // AND `occupancy_childs1` >= ?
})->orWhere(function($query) use ($erwachsene, $kinder) { // ) OR (
$query->where("occupancy_adults2", ">=", $erwachsene); // `occupancy_adults2` >= ?
$query->where("occupancy_childs2", ">=", $kinder); // AND `occupancy_childs2` >= ?
}); // )
}); // )
第一个 where 级别将创建外部括号,第二个 where 级别将创建 OR,第三个将创建内部 AND。