Laravel 5:检查是否尚未采用事件日期范围

时间:2016-10-25 16:21:11

标签: php laravel date laravel-5 laravel-5.2

我正在创建几天事件的日历,事件不能重叠。但是当另一个事件开始/结束时,事件可以开始/结束。

在Laravel中,在我的事件模型表中,我存储事件的开始和结束日期。 在存储新事件数据库之前如何检查它是否有效(与现有事件不重叠,不包括保证金/边界天数)?

This is the idea

事先感谢你的帮助。

4 个答案:

答案 0 :(得分:5)

您可以使用以下代码来获取在特定时间之间预订的事件的正确计数:

$eventsCount = Events::where(function ($query) use ($startTime, $endTime) {
 $query->where(function ($query) use ($startTime, $endTime) {
    $query->where('start', '>=', $startTime)
            ->where('end', '<', $startTime);
    })
    ->orWhere(function ($query) use ($startTime, $endTime) {
        $query->where('start', '<', $endTime)
                ->where('end', '>=', $endTime);
    });
})->count();

答案 1 :(得分:2)

这只是一些伪代码,因为您不提供任何代码或模型,但根据您的表的设置方式,您应该能够这样做。这将返回新事件的开始时间或结束时间落在现有事件的开始和结束时间之间的任何事件。如果您的时间是时间戳或DateTime列,这将有效。

 Events::where(DB::raw("? between start_time and end_time",$start))
      ->orWhere(DB::raw("? between start_time and end_time",$end))
      ->get();

答案 2 :(得分:1)

->where(function ($query) use($startDate, $endDate, $currentDate) {
                        $query->where('start_date', '<=', $startDate)
                            ->where('end_date', '>=', $endDate)
                            ->where('end_date', '>', $currentDate);
                    })
                    ->orWhere(function ($query) use($startDate, $endDate, $currentDate) {
                        $query->where('start_date', '>=', $startDate)
                            ->where('end_date', '<=', $endDate)
                            ->where('end_date', '>', $currentDate);
                    })
                    ->orWhere(function ($query) use($startDate, $endDate, $currentDate) {
                        $query->where('start_date', '<=', $startDate)
                            ->where('end_date', '>=', $startDate)
                            ->where('end_date', '>', $currentDate);
                    })
                    ->orWhere(function ($query) use($startDate, $endDate, $currentDate) {
                        $query->where('start_date', '<=', $endDate)
                            ->where('end_date', '>=', $endDate)
                            ->where('end_date', '>', $currentDate);

答案 3 :(得分:0)

将其用于所有变体交点日期范围。对我有帮助

$rangeCount = TransferSchedule::where(function ($query) use ($from, $to) {
                $query->where(function ($query) use ($from, $to) {
                    $query->where('date_from', '<=', $from)
                        ->where('date_to', '>=', $from);
                })->orWhere(function ($query) use ($from, $to) {
                    $query->where('date_from', '<=', $to)
                        ->where('date_to', '>=', $to);
                })->orWhere(function ($query) use ($from, $to) {
                    $query->where('date_from', '>=', $from)
                        ->where('date_to', '<=', $to);
                });
            })->count();