[英]Booking Time slot, with Equipment Stock query, in Laravel
这是一个对大家来说很有趣的。 我发现自己陷入了实施难题。
我正在 Laravel 中开发一个预订应用程序,它允许人们在特定时间为空间预订房间和设备。 可用设备的数量是有限的,因此库存数量必须与预订相关的时间段一起查询。
我认为我已经通过遍历同时发生的“其他预订”并计算当前正在使用的项目来解决问题 - >然后检查是否有库存。
对于我 90% 的测试,这工作正常,但刚刚设法找到一个不允许我这样做的错误。
$guitarheadcount = 0;
$guitarcabcount = 0;
$guitarcombocount = 0;
$bassheadcount = 0;
$basscabcount = 0;
$basscombocount = 0;
$drumkitcount = 0;
$cymbalscount = 0;
$otherbookings = Booking::where('Room_id', '!=', $bookinginfo->Room_id)
->where(function ($query) use ($begin, $end) {
$query->where(function ($q) use ($begin, $end) {
$q->where('Booking_start', '>=', $begin)
->where('Booking_start', '<', $end);
})->orWhere(function ($q) use ($begin, $end) {
$q->where('Booking_start', '<=', $begin)
->where('Booking_end', '>', $end);
})->orWhere(function ($q) use ($begin, $end) {
$q->where('Booking_end', '>', $begin)
->where('Booking_end', '<=', $end);
})->orWhere(function ($q) use ($begin, $end) {
$q->where('Booking_start', '>=', $begin)
->where('Booking_end', '<=', $end);
});
})->get();
//'amounts' are attributes for Booking objects.
foreach($otherbookings as $other){
$guitarheadcount = $other->Equip->guitarheadamount + $guitarheadcount;
$guitarcabcount = $other->Equip->guitarcabamount + $guitarcabcount;
$guitarcombocount = $other->Equip->guitarcomboamount + $guitarcombocount;
$bassheadcount = $other->Equip->bassheadamount + $bassheadcount;
$basscabcount = $other->Equip->basscabamount + $basscabcount;
$basscombocount = $other->Equip->basscomboamount + $basscombocount;
$drumkitcount = $other->Equip->drumkitamount + $drumkitcount;
$cymbalscount = $other->Equip->cymbalsamount + $cymbalscount;
}
然后,我使用单独的 if 语句来重定向,如果计数最终大于库存中的数量。
运行中的错误示例是:
库存 2 套鼓组。 在下午 1 点到 2 点预订一个……然后在下午 2 点到 3 点在同一个房间预订另一个。 两者都需要架子鼓。
如果我然后尝试在下午 1 点到 3 点在不同的空间进行预订,那么计数已经是 2,即使一组鼓再次免费(如果这有意义的话)。
我真的很难过。 我无法想象是否需要:
任何帮助将不胜感激。
我将对此进行进一步测试,但我想我可能已经提出了一个解决方案。
我已经拥有的:
在选定的时间范围内获取所有冲突预订的机制。 它可以提供集合中包含的所有项目的计数。 它“不知道”的是,在预订过程中,库存是否会用完。
解决方案(到目前为止,早期测试正在运行)。
我使用 orderBy 按开始时间对原始查询结果进行排序。
我使用了一个 foreach 来遍历它们。
我在循环之外定义了几个 arrays ,我可以使用它们将先前循环的属性传递回下一个循环。 如果未发现计数错误,则在最后覆盖。
然后我创建了一些 if 语句来检查下一个预订与前一个预订。
如果下一次开始是在前一次结束之前,我创建了另一个数组来传递当前值,然后在 if 中为每个数组开始另一个数组,然后重新计算该时间范围内的所有预订。 如果计数再次出现,它将突破并重定向,go 在这段时间内超出可用库存。
当该循环结束时,我们将继续前一个循环。
为意大利面条代码道歉。
$first = $otherbookings->first();
if ($first == null){
}else{
$previous = [];
$previous ['id'] = $first->id;
$previous ['Booking_end'] = $first->Booking_end;
}
$tempdrumkitcount = 0;
foreach($otherbookings as $other){
if($previous ['id'] == $other->id){
$drumkitcount = (int)$first->Equip->drumkitamount;
//check
if(($currenthireprices->drumkitstock - ($other->drumkitamount + $drumkitcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Check 1 error");
}
}
else{
if($previous ['Booking_end'] > $other->Booking_start){
$current ['id'] = $other->id;
$current ['Booking_start'] = $other->Booking_start;
$current ['Booking_end'] = $other->Booking_end;
foreach($otherbookings as $newother){
if($newother->id != $current ['id']){
if(($newother->Booking_start < $current ['Booking_start']) && ($newother->Booking_end > $current ['Booking_start'] )){
$tempdrumkitcount = $tempdrumkitcount + $newother->Equip->drumkitamount;
}
if(($newother->Booking_start > $current ['Booking_start']) && ($newother->Booking_end < $current ['Booking_end'] )){
$tempdrumkitcount = $tempdrumkitcount + $newother->Equip->drumkitamount;
}
if(($currenthireprices->drumkitstock - ($drumkitamount + $tempdrumkitcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend to complete your booking. (Error- 100 [Cummalative Check]).");
}
}
}
$drumkitcount = $other->Equip->drumkitamount + $drumkitcount;
if(($currenthireprices->drumkitstock - ($drumkitamount + $drumkitcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend to complete your booking. (Error- 150 [Non-Cummalative Check]).");
}
$drumkitcount = $drumkitcount - $previous ['drumkitamount'];
}
if($previous ['Booking_end'] <= $other->Booking_start){
$drumkitcount = $drumkitcount - $previous ['drumkitamount'];
$drumkitcount = $drumkitcount + $other->Equip->drumkitamount;
if(($currenthireprices->drumkitstock - ($drumkitamount + $drumkitcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend to complete your booking. (Error- 200 [Non-overlap main check]).");
}
}
}
$previous ['id'] = $other->id;
$previous ['Booking_end'] = $other->Booking_end;
$previous ['drumkitamount'] = $other->Equip->drumkitamount;
}
虽然我之前回答中的方法看起来很有希望......随着库存量和相邻预订量的增加,它开始产生无法修复的计数错误。
我重新思考并设计了一个更好的解决方案。 无论如何,用户只能预订至少 30 分钟的时段。
因此,使用 do/while 循环,对于用户选择的时间段每增加 30 分钟,它就会进行一次库存检查。
我敢肯定,锤击服务器不是很好,但至少在预订期间会有固定的时间对其进行查询。
///STOCK CHECK
$stockcheckbegin = $begin;
$stockcheckend = date("Y-m-d H:i", strtotime('+30 minutes',strtotime($begin)));
$tempguitarheadcount = 0;
$tempguitarcabcount = 0;
$tempguitarcombocount = 0;
$tempbassheadcount = 0;
$tempbasscabcount = 0;
$tempbasscombocount = 0;
$tempdrumkitcount = 0;
$tempcymbalscount = 0;
do {
$otherbookings = Booking::orderby('Booking_start', 'ASC')
->where(function ($query) use ($stockcheckbegin, $stockcheckend) {
$query->where(function ($q) use ($stockcheckbegin, $stockcheckend) {
$q->where('Booking_start', '>=', $stockcheckbegin)
->where('Booking_start', '<', $stockcheckend);
})->orWhere(function ($q) use ($stockcheckbegin, $stockcheckend) {
$q->where('Booking_start', '<=', $stockcheckbegin)
->where('Booking_end', '>', $stockcheckend);
})->orWhere(function ($q) use ($stockcheckbegin, $stockcheckend) {
$q->where('Booking_end', '>', $stockcheckbegin)
->where('Booking_end', '<=', $stockcheckend);
})->orWhere(function ($q) use ($stockcheckbegin, $stockcheckend) {
$q->where('Booking_start', '>=', $stockcheckbegin)
->where('Booking_end', '<=', $stockcheckend);
});
})->get();
foreach($otherbookings as $other){
$tempguitarheadcount = $tempguitarheadcount + $other->Equip->guitarheadamount;
$tempguitarcabcount = $tempguitarcabcount + $other->Equip->guitarcabamount;
$tempguitarcombocount = $tempguitarcombocount + $other->Equip->guitarcomboamount;
$tempbassheadcount = $tempbassheadcount + $other->Equip->bassheadamount;
$tempbasscabcount = $tempbasscabcount + $other->Equip->basscabamount;
$tempbasscombocount = $tempbasscombocount + $other->Equip->basscomboamount;
$tempdrumkitcount = $tempdrumkitcount + $other->Equip->drumkitamount;
$tempcymbalscount = $tempcymbalscount + $other->Equip->cymbalsamount;
if(($currenthireprices->guitarheadstock - ($guitarheadamount + $tempguitarheadcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Guitar Head' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->guitarcabstock - ($guitarcabamount + $tempguitarcabcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Guitar Cab' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->guitarcombostock - ($guitarcomboamount + $tempguitarcombocount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Guitar Combo' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->bassheadstock - ($bassheadamount + $tempbassheadcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Bass Head' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->basscabstock - ($basscabamount + $tempbasscabcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Bass Cab' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->basscombostock - ($basscomboamount + $tempbasscombocount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Bass Combo' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->drumkitstock - ($drumkitamount + $tempdrumkitcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our 'Drum kit' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
if(($currenthireprices->cymbalsstock - ($cymbalsamount + $tempcymbalscount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Sorry! Our sets of 'Cymbals' stock will run out during the course of this booking. (Between $stockcheckbegin and $stockcheckend)");
}
}
$tempguitarheadcount = 0;
$tempguitarcabcount = 0;
$tempguitarcombocount = 0;
$tempbassheadcount = 0;
$tempbasscabcount = 0;
$tempbasscombocount = 0;
$tempdrumkitcount = 0;
$tempcymbalscount = 0;
$stockcheckbegin = date("Y-m-d H:i", strtotime('+30 minutes',strtotime($stockcheckbegin)));
$stockcheckend = date("Y-m-d H:i", strtotime('+30 minutes',strtotime($stockcheckend)));
} while ($stockcheckbegin != $end);
if(($currenthireprices->guitarheadstock - ($guitarheadamount + $guitarheadcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $guitarheadamount guitar heads available between $timestart and $timeend. There's $currenthireprices->guitarheadstock in stock and $guitarheadcount in use.");
}
if(($currenthireprices->guitarcabstock - ($guitarcabamount + $guitarcabcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $guitarcabamount 'Guitar cabs' available between $timestart and $timeend. There's $currenthireprices->guitarcabstock in stock and $guitarcabcount in use.");
}
if(($currenthireprices->guitarcombostock - ($guitarcomboamount + $guitarcombocount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $guitarcomboamount 'Guitar combos' available between $timestart and $timeend. There's $currenthireprices->guitarcombostock in stock and $guitarcombocount in use.");
}
if(($currenthireprices->bassheadstock - ($bassheadamount + $bassheadcount)) < 0) {
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $bassheadamount 'Bass heads' available between $timestart and $timeend. There's $currenthireprices->bassheadstock in stock and $bassheadcount in use.");
}
if(($currenthireprices->basscabstock - ($basscabamount + $basscabcount)) < 0) {
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $basscabamount 'Bass cabs' available between $timestart and $timeend. There's $currenthireprices->basscabstock in stock and $basscabcount in use.");
}
if(($currenthireprices->basscombostock - ($basscomboamount + $basscombocount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $basscomboamount 'Bass combos' available between $timestart and $timeend. There's $currenthireprices->basscombostock in stock and $basscombocount in use.");
}
if(($currenthireprices->drumkitstock - ($drumkitamount + $drumkitcount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $drumkitamount 'Drum kits' available between $timestart and $timeend. There's $currenthireprices->drumkitstock in stock and $drumkitcount in use.");
}
if(($currenthireprices->cymbalsstock - ($cymbalsamount + $cymbalscount)) < 0){
return redirect()->back()->withInput()->with('Booking_query_error', "Unfortunatly there aren't $cymbalsamount 'sets of cymbals' available between $timestart and $timeend. There's $currenthireprices->cymbalsstock in stock and $cymbalscount in use.");
}
//----- END OF STOCK CHECK
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.