遍历每个对象并返回它的可用性(Laravel)

时间:2017-01-04 10:21:51

标签: php mysql laravel loops eloquent

我有一个用户可以租车的应用程序。这些车已经在我的数据库中了。

$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)。我必须确保:

  1. 同一辆车(A)不能同时保留。
  2. 所有车辆都可以在同一时间使用(A)车。
  3. 所以我首先想出了这个功能

    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:002017-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);
    

2 个答案:

答案 0 :(得分:1)

确保您在数据库表中使用DATETIME数据类型而不使用TIMESTAMP CURRENT_TIME_STAMP。

如果您使用当前时间戳,则将其更改为DATETIME并将表单日期字段值保存在循环中。我希望它能奏效!

答案 1 :(得分:1)

在我看来,您需要的是更好的数据库设计。

因为看起来你有不同数量的同一辆车(是吗?如果不是请评论或者这车识别是真车识别吗?=>它是独一无二的)

如果是这样,您需要的是处理数据库的正确方法。在这种情况下,您必须实现一对多关系(具有多个实例的同一ID汽车)。 如果是这种情况,您可能需要在汽车上添加另一个字段;像汽车数量的东西。然后,您可以根据总数量检查预留的汽车。然后,如果预留车辆的数量少于您拥有的数量,则可以预留。

如果是其他方式(每辆车都有唯一的身份证 - 没有重复数量相同的汽车); 然后当您检查汽车的插槽是否可用时,获取该汽车的所有预订并检查它是否具有相同(或之间)的预订。 如果这不是您想要的,请发表评论。

修改

您可能需要考虑一些有关数据库规范化的内容。阅读教程here at tutorials-point

  1. 首先将车辆ID添加到预订表中。
  2. 将用户ID添加到预订表。
  3. 然后您可以按照以下说明预订该车。
  4. 检查您的预订是否在检索到的预订中。
  5. 在laravel中,您可以编写像

    这样的选择查询
    $reservations= DB::table('reservations')->where('car_id', '=', 100)->get()  // if car_id = 100
    

    要阅读有关laravel数据库查询的更多信息,请参阅Documentation