【问题标题】:Loop through each object and return it's availability (Laravel)循环遍历每个对象并返回它的可用性(Laravel)
【发布时间】: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) 保存日期和时间时。我必须确保:

  1. 同一时间不能再次预订同一辆车(A)。
  2. 所有车辆在预留车辆 (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: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);

【问题讨论】:

    标签: php mysql laravel loops eloquent


    【解决方案1】:

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

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

    【讨论】:

    • 我将日期和时间作为 DATETIME 存储在一个实体中。你能解释一下吗?
    【解决方案2】:

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

    您似乎拥有不同数量的同一辆车(是吗?如果不是,请发表评论或者这个汽车 ID 是否类似于真实汽车 ID?=> 它是独一无二的)

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

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

    编辑

    您可能需要考虑一些有关数据库规范化的问题。看教程here at tutorials-point

    1. 首先将汽车 ID 添加到预订表中。
    2. 将用户 ID 添加到预留表中。
    3. 那么您可以按如下所述获得该车的预订。
    4. 检查您的预订是否在检索到的预订中。

    在 laravel 中,您可以编写选择查询,例如

    $reservations= DB::table('reservations')->where('car_id', '=', 100)->get()  // if car_id = 100
    

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

    【讨论】:

    • 我的数据库中有不同型号的不同汽车。 Car id 是与汽车关联的 mysql id,它是唯一的。我面临的情况是第二个问题,我的问题就是你刚才所说的“获取那辆车的所有预订,并检查它是否有相同(或之间)的预订。”在我的汽车模型中,我有 return $this->hasMany('User','car_user');
    • 那么你为什么不试着写一个(select all where car_id ="your carid")查询呢?
    • 我已经添加了如何在 laravel 中将查询写入答案
    • 如何将汽车分配到请求的时间,下次用户请求汽车时,我可以循环查看汽车的预订时间。逐个。我在检查它是否有相同的预订时迷失了,而不是检查我的预订表来检查是否有重叠......抱歉刚刚看到你的编辑。这个查询应该去哪里?
    • 请解释一下您是如何将您的汽车分配到时间段的。 ?一个更好的方法是在 car 和 time_slot 之间创建关系。并将它们保存在不同的表中。我以为那张桌子是预订的。将汽车 ID 添加到预订表中。
    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    相关资源
    最近更新 更多