给你们大家一个有趣的例子。我发现自己陷入了一个实施难题。
我正在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语句来重定向计数是否大于股票中的金额。
这个bug的一个例子是:
库存2个鼓包。订一张下午1-2点的票。。。下午2-3点,另一个在同一个房间。都需要一个鼓。
如果我试着从下午1点到3点在另一个地方预订的话,就算有一套鼓是免费的(如果有意义的话),数量已经是2了。
我真的被难住了。如果我需要:
继续“计数”,但是对于与另一个(?)在同一个房间的每一个项目,产生一个扣减1的值。
我是否应该完全报废计数和写每个设备项目的个人查询。。。我怎么会这么做!
任何帮助都将不胜感激。
2条答案
按热度按时间vcudknz31#
我将进一步测试这个,但我想我可能已经提出了一个解决方案。
我已经拥有的:
在选定的时间范围内获取所有冲突预订的机制。它可以提供集合中包含的所有项的计数。它不知道的是,在预订过程中,库存是否会用完。
解决方案(到目前为止,早期测试正在工作)。
我使用orderby按开始时间对原始查询结果进行排序。
我用foreach把它们都翻了一遍。
我在循环外定义了几个数组,可以使用它们将之前循环的属性传递回下一个循环。如果没有发现计数错误,则在末尾覆盖。
然后,我创建了一些if语句,用于检查下一个预订与上一个预订之间的差异。
如果下一个开始在上一个结束之前,那么我创建了另一个数组来传递当前值,为if中的每个数组启动另一个数组,然后对该时间范围内的所有预订进行重新计数。然后,如果计数再次超出可用库存,它就会爆发并重新定向。
当这个循环完成后,我们继续上一个循环。
为意大利面密码道歉。
r9f1avp52#
虽然我之前的答案看起来很有希望。。。随着库存量和相邻预订量的增加,它开始出现无法纠正的计数错误。
我重新考虑了一下,想出了一个更好的解决办法。无论如何,用户只能预订至少30分钟的时段。
因此,使用do/while循环,对于用户选择的时隙每增加30分钟,它将执行一次库存检查。
我敢肯定,这是不是伟大的锤打服务器,但至少有一个固定的时间,它将被查询在预订。