Laravel Eloquent 日期范围介于范围之间
Laravel Eloquent date range between range
我正在建立一个具有预订机制的网站。
如果房间可用,用户可以预订酒店房间X天。
我正在使用:
- Laravel 5.4
- MySql
如果出现以下情况,则房间不可用:
- 已被其他用户预订
- 管理员已将其设置为不可用
- 客房容量小于或等于旅客人数
如果有 3 tables 来存储这些数据:
- Rent:包含预订信息,例如 rentStartDate 和 rentEndDate(作为 DateTime)和其他字段(userId,rentalId,...)
- 不可用:当管理员将房间设置为不可用时,它会存储在这里。我有字段 unavailabilityStartDate、unavailabilityEndDate(作为 DateTime)和 rentalId
- 租金:此 table 包含有关房间的所有信息(容量、名称、位置...)
我正在努力构建一个 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 中有一行:
- 不可用开始日期 = 2017-04-26 00:00:00
- 不可用结束日期 = 2017-04-30 00:00:00
当使用存储在 Unavailabilities 中的范围之外的一些日期调用该方法时,我得到了预期的结果。当用完全相同的日期调用它时,我没有得到任何结果(这就是我想要的)。
到目前为止,一切都很好!
问题是,如果我以 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 日期之前没有结束的所有租金和不可用记录。
试着画一个时间图。
我正在建立一个具有预订机制的网站。 如果房间可用,用户可以预订酒店房间X天。
我正在使用:
- Laravel 5.4
- MySql
如果出现以下情况,则房间不可用:
- 已被其他用户预订
- 管理员已将其设置为不可用
- 客房容量小于或等于旅客人数
如果有 3 tables 来存储这些数据:
- Rent:包含预订信息,例如 rentStartDate 和 rentEndDate(作为 DateTime)和其他字段(userId,rentalId,...)
- 不可用:当管理员将房间设置为不可用时,它会存储在这里。我有字段 unavailabilityStartDate、unavailabilityEndDate(作为 DateTime)和 rentalId
- 租金:此 table 包含有关房间的所有信息(容量、名称、位置...)
我正在努力构建一个 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 中有一行:
- 不可用开始日期 = 2017-04-26 00:00:00
- 不可用结束日期 = 2017-04-30 00:00:00
当使用存储在 Unavailabilities 中的范围之外的一些日期调用该方法时,我得到了预期的结果。当用完全相同的日期调用它时,我没有得到任何结果(这就是我想要的)。 到目前为止,一切都很好! 问题是,如果我以 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 日期之前没有结束的所有租金和不可用记录。
试着画一个时间图。