【问题标题】:Laravel Eloquent date range between rangeLaravel Eloquent 日期范围
【发布时间】:2017-08-28 08:30:30
【问题描述】:

我正在建立一个有预订机制的网站。 如果房间可用,用户可以预订 X 天的酒店房间。

我正在使用:

  • Laravel 5.4
  • MySql

如果出现以下情况,房间将不可用:

  • 已被其他用户预订
  • 管理员已将其设置为不可用
  • 房间容量小于或等于旅客人数

如果有 3 个表来存储这些数据:

  • Rent:包含预订信息,例如rentStartDate 和rentEndDate(作为DateTime)以及其他字段(userId、rentalId、...)
  • 不可用:当管理员将房间设置为不可用时,它会存储在这里。我有字段 unavailabilityStartDate、unavailabilityEndDate(作为 DateTime)和 rentId
  • 租金:此表包含有关房间的所有信息(容量、名称、位置...)

我正在努力构建一个 Eloquent 查询,以在处理用户付款之前检查房间是否可用。这是我现在所拥有的:

public function isAvailableAtDates($rentalId, $startDate, $endDate, $capacity) {
    $from = min($startDate, $endDate);
    $till = max($startDate, $endDate);

    $result = DB::table('rentals')
        ->where([
            ['rentals.rentalId', '=', $rentalId],
            ['rentals.rentalCapacity', '>=', $capacity]
        ])
        ->whereNotIn('rentals.rentalId', function($query) use ($from, $till, $rentalId) {
            $query->select('unavailabilities.rentalId')
                ->from('unavailabilities')
                ->where([
                    ['unavailabilities.rentalId', '=', $rentalId],
                    ['unavailabilityStartDate', '>=', $from],
                    ['unavailabilityEndDate', '<=', $till],
                ]);

        })
        ->whereNotIn('rentals.rentalId', function($query) use ($from, $till, $rentalId) {
            $query->select('rent.rentalId')
                ->from('rent')
                ->where([
                    ['rent.rentalId', '=', $rentalId],
                    ['rentStartDate', '>=', $from],
                    ['rentEndDate', '<=', $till]
                ]);
        })
        ->select('rentals.rentalId')
        ->get();

    return count($result) == 1;
}

假设我在 Unavailabilities 中有一行:

  • unavailabilityStartDate = 2017-04-26 00:00:00
  • unavailabilityEndDate = 2017-04-30 00:00:00

当使用存储在 Unavailabilities 中的范围之外的某些日期调用该方法时,我得到了预期的结果。当用完全相同的日期调用它时,我没有得到任何结果(这就是我想要的)。 到目前为止,一切都很好! 问题是,如果我以 4 月 26 日至 30 日之间的开始日期和 5 月晚些时候的结束日期来调用它,即使我不应该这样做,我仍然会得到结果。

谁能帮我解决这个问题?

【问题讨论】:

  • rentStartDaterentEndDate 列的数据类型是什么? $from$till 的确切输出是什么
  • rentStartDate 和rentEndDate 都是日期时间。 $来自 = "2017-04-20 00:00:00"; $till = "2017-04-27 00:00:00";感谢您的宝贵时间!

标签: php mysql laravel date eloquent


【解决方案1】:

这不是 laravel 问题,也不是 mysql 问题。

试试这个:

->whereNotIn('rentals.rentalId', function($query) use ($from, $till, $rentalId) {
        $query->select('unavailabilities.rentalId')
            ->from('unavailabilities')
            ->where([
                ['unavailabilities.rentalId', '=', $rentalId],
                ['unavailabilityStartDate', '<=', $till],
                ['unavailabilityEndDate', '>=', $from],
            ]);

    })
->whereNotIn('rentals.rentalId', function($query) use ($from, $till, $rentalId) {
        $query->select('rent.rentalId')
            ->from('rent')
            ->where([
                ['rent.rentalId', '=', $rentalId],
                ['rentStartDate', '<=', $till],
                ['rentEndDate', '>=', $from]
            ]);
    })

您需要在 $till 之前开始且在 $from 日期之前未结束的所有租金和不可用记录。

试着画一张时间图。

【讨论】:

  • 行得通!我以错误的方式做逻辑......非常感谢@skido
  • 祝你有美好的一天;)
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2020-10-05
  • 1970-01-01
  • 2014-01-07
  • 2022-11-01
相关资源
最近更新 更多