我有一个用户可以租车的应用程序。这些车已经在我的数据库中了。
$table->string('name')->nullable();
$table->string('color')->nullable();
$table->string('model')->nullable();
因为这是租房我有预订表
$table->increments('id');
$table->dateTime('from_date')->nullable();
$table->dateTime('to_date')->nullable();
我已经创建了一个用户请求汽车的功能,该功能将循环并找到相同的汽车。
和car_user将保留的汽车与用户链接起来。
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->integer('car_id')->unsigned();
$table->foreign('car_id')->references('id')->on('cars');
现在,当我尝试保存特定要求的汽车的日期和时间时(A)。我必须确保:
所以我首先想出了这个功能
public function isSlotAvailable(Request $request) {
$appointments = Reservation::all();
$from = Carbon::parse( $request->from);
$to = Carbon::parse( $request->to);
foreach ($appointments as $appointment) {
$eventStart = Carbon::instance(
new DateTime($appointment['dt_start'])
);
$eventEnd = Carbon::instance(
new DateTime($appointment['dt_end'])
)->subSecond(1);
if ($from->between($eventStart, $eventEnd) ||
$to->between($eventStart, $eventEnd) ||
($eventStart->between($from, $to) && $eventEnd->between($from, $to))) {
return false;
}
}
return true;
}
此功能将检查Reservation表中是否有可用性。但这是错误的,因为它将汽车视为一辆汽车。例如,如果我在数据库中有5辆汽车可供使用,则用户会预订从2017-01-05 05:00:00
到2017-01-10 09:00:00
的汽车。所有车辆将同时保留,因为循环不会像$car->allreservation
那样通过每辆车。
问题
如何在每辆车中循环并检查新请求的日期是否重叠?如果它重叠,它将转到第二辆车检查,如果没有,那么它将链接到用户。
非常感谢您的帮助
更新
这是我保存新请求的汽车的方式
$id = $new_car->id;
$Reservation_id = $time->id;
$user->cars()->attach($id, ['type' => 'requested']);
$user->reservations()->attach(Reservation_id);
答案 0 :(得分:1)
确保您在数据库表中使用DATETIME数据类型而不使用TIMESTAMP CURRENT_TIME_STAMP。
如果您使用当前时间戳,则将其更改为DATETIME并将表单日期字段值保存在循环中。我希望它能奏效!
答案 1 :(得分:1)
在我看来,您需要的是更好的数据库设计。
因为看起来你有不同数量的同一辆车(是吗?如果不是请评论或者这车识别是真车识别吗?=>它是独一无二的)
如果是这样,您需要的是处理数据库的正确方法。在这种情况下,您必须实现一对多关系(具有多个实例的同一ID汽车)。 如果是这种情况,您可能需要在汽车上添加另一个字段;像汽车数量的东西。然后,您可以根据总数量检查预留的汽车。然后,如果预留车辆的数量少于您拥有的数量,则可以预留。
如果是其他方式(每辆车都有唯一的身份证 - 没有重复数量相同的汽车); 然后当您检查汽车的插槽是否可用时,获取该汽车的所有预订并检查它是否具有相同(或之间)的预订。 如果这不是您想要的,请发表评论。
修改强>
您可能需要考虑一些有关数据库规范化的内容。阅读教程here at tutorials-point
在laravel中,您可以编写像
这样的选择查询$reservations= DB::table('reservations')->where('car_id', '=', 100)->get() // if car_id = 100
要阅读有关laravel数据库查询的更多信息,请参阅Documentation