繁体   English   中英

Laravel雄辩的日期范围

[英]Laravel Eloquent date range between range

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

我在用:

  • Laravel 5.4
  • MySQL的

在以下情况下,该房间不可用:

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

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

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

我正在努力建立一个雄辩的查询来检查房间是否可用,然后再处理用户付款。 这是我现在拥有的:

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;
}

假设我在“不可用”中有一行:

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

当调用该方法的日期超出“不可用”中存储的范围时,我得到了预期的结果。 当用完全相同的日期调用它时,我没有任何结果(这就是我想要的)。 到现在为止还挺好! 问题是,如果我用4月26日到30日之间的开始日期和5月下旬的结束日期来调用它,即使我不应该仍然得到结果。

有人可以帮我吗?

这不是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日期之前尚未结束的租金和不可用记录。

尝试绘制时间图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM