进行查询以使元素在 2 个特定日期之间的时间处于活动状态



似乎无法理解正确的逻辑。我有一个需要 2 个日期($date 1$date 2)的函数。我有事件的数据库记录,也有 2 个日期(starting_atending_at)。

我想获取与 $date 1 和 $date 2 之间的时间完全或部分重叠的所有事件。我已经浏览了其他类似的主题并提出了这个......但我有一种感觉,这是不正确的。

$events = Event::with(['user']);
    $events->where(function($query) use ($date1,$date2) {
        $query->where(function($query) use ($date2) {
            $query->where('starting_at', '<=', $date2);
        });
        $query->where(function($query) use ($date1) {
            $query->where('ending_at', '>=', $date1);
        });
    });

如果日期位于同一表中,请使用:

$events = Event::with('user')
               ->where('starting_at', '<=', $date2)
               ->where('ending_at', '>=', $date1)
               ->get();

确保已将starting_atending_at添加到dates数组:

protected $dates = ['starting_at', 'ending_at'];

使用 Laravel 5.3(也许是 5.2,但肯定是 5.3),您可以执行以下操作:

$events = $events->whereBetween($date1, $date2)->get();

较低的版本可能是:

$events = $events->where('starting_at', '<=', $date2)
                 ->where('ending_at', '>=', $date1)
                 ->get();

> Laravel有一个简单的方法可以做到这一点。

$events = Event::with(['user'])->whereBetween('field_name', array($date1, $date2))->get();

在此处查看文档 https://laravel.com/docs/5.3/queries#where-clauses

更新

如果date1date2来自数据库上完全不同的列,那么请参考@Alexey更合适的Mezenin答案。

最新更新