[英]php - laravel : How to handle time overlapping in database?
我想在我的數據庫中保存兩個時間間隔。 它將檢查數據庫,如果有人已經預訂了那個時間,它不會節省時間,而如果它是空的,它將節省用戶將作為輸入提供的時間。
例如。 用戶想要預訂 8:00 到 8:30 的時間表,同時保存到數據庫中,它會在數據庫中檢查是否有人已經占用了該時間,如果沒有,則將保存,否則不會。 同時用戶即使在 8:15 也無法輸入。
我如何解決這個重疊問題?
這是我使用的控制器代碼,但它沒有運行:
public function postAllocateRoom(Request $request)
{
$classRoom = new ClassRoom();
$classRoom->department_id=$request->Input(['department_id']);
$classRoom->room_id=$request->Input(['room_id']);
$classRoom->course_id=$request->Input(['course_id']);
$classRoom->day_id=$request->Input(['day_id']);
$classRoom->start=$request->Input(['start']);
$classRoom->end=$request->Input(['end']);
$startTime = Carbon::parse($request->input('start'));
$endTime = Carbon::parse($request->input('end'));
$classRoomCount = ClassRoom::where(function ($query) {
$query->where('start', '>=', $startTime)
->where('end', '<=', $startTime); })->count();
$messages ="Class Room Already Taken";
if ($classRoomCount > 0) {
return redirect('allocateRoomPage',$message);
}
else {
$classRoom->save();
return redirect('allocateRoomPage');
}
}
時間重疊的規則很簡單(請參閱此處以獲取完整的圖形說明):
start1 < end2 AND end1 > start2
所以你的查詢可以是:
$classRoomCount = ClassRoom::where
(
function( $query ) use( $startTime, $endTime )
{
$query->where( 'start', '<', $endTime )
->where( 'end', '>', $startTime);
}
)->count();
首先,為了能夠在查詢閉包中訪問$startTime
和$endTime
,您需要使用use
構造傳遞它們,即
function ($query) use ($startTime, $endTime)
以下應該有助於獲得在特定時間之間預訂的教室的正確計數:
$classRoomCount = ClassRoom::where(function ($query) use ($startTime, $endTime) {
$query
->where(function ($query) use ($startTime, $endTime) {
$query
->where('start', '>=', $startTime)
->where('end', '<', $startTime);
})
->orWhere(function ($query) use ($startTime, $endTime) {
$query
->where('start', '<', $endTime)
->where('end', '>=', $endTime);
});
})->count();
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.