我正在使用Laravel 6。 我有一个创建会议的表格。我想创建一个自定义验证器,以检查当时该房间是否已被占用。查询参数为“房间”,“约会”,“开始”和“结束”。
换句话说,我想用Laravel进行以下MySQL查询:
SELECT *
FROM `meetings`
WHERE id_room = 1 AND date = '2021-03-02' AND ((start_hour >= '22:00:00' AND start_hour < '23:00:00') OR (start_hour < '22:00:00' AND end_hour >= '23:00:00') OR (end_hour > '22:00:00' AND end_hour <= '23:00:00'))
我使用Laravel创建了以下查询,但无法正常工作:
public function passes($attribute, $value)
{
$meetings = DB::table('meetings')
->where('id_room', request('room'))
->where('date', request('date_meeting'))
->where(function ($query) {
$query->where('start_hour', '>=', request('start'))
->where('start_hour', '<', request('end'));
})
->orWhere(function ($query) {
$query->where('start_hour', '<', request('start'))
->where('end_hour', '>=', request('end'));
})
->orWhere(function ($query) {
$query->where('end_hour', '>', request('start'))
->where('end_hour', '<=', request('end'));
})
->get();
if(count($meetings) > 0) {
return false;
} else {
return true;
}
}
房间和日期在Laravel中可以正常使用...但是时间不能很好地使用。 你知道为什么它不能正常工作吗?
答案 0 :(得分:0)
因为您的orWhere
查询与where('id_room', request('room'))
处于同一级别
您需要添加两级嵌套查询,如下所示:
$meetings = DB::table('meetings')
->where('id_room', request('room'))
->where('date', request('date_meeting'))
->where(function ($query) {
$query->where(function($sub_q) {
$sub_q->where('start_hour', '>=', request('start'))
->where('start_hour', '<', request('end'));
})
->orWhere(function($sub_q) {
$sub_q->where('start_hour', '<', request('start'))
->where('end_hour', '>=', request('end'));
})
->orWhere(function($sub_q) {
$sub_q->where('end_hour', '>', request('start'))
->where('end_hour', '<=', request('end'));
});
})->get();