【发布时间】:2017-01-04 10:21:51
【问题描述】:
我有一个用户可以租用汽车的应用。这些汽车已经在我放置的数据库中。
$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) 保存日期和时间时。我必须确保:
- 同一时间不能再次预订同一辆车(A)。
- 所有车辆在预留车辆 (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;
}
此函数将检查预订表中是否有空房。但这是错误的,因为它将汽车视为一辆车。例如,如果我在数据库中有 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);
【问题讨论】:
标签: php mysql laravel loops eloquent