如何用Laravel搜索另一个范围之间的日期范围


How to search a range of dates between another range with Laravel?

我对使用Laravel很陌生,但我已经设法创建了一个相当基本的API。我开始尝试向API添加过滤器,我需要的主要过滤器是查看日期范围是否与另一个日期范围重叠。

例如,下面是一个从数据库返回的典型数据对象:
{
    id: 1,
    name: 'This is the name',
    start_date: '2017-01-03',
    end_date: '2017-01-29'
}

用户通常会按较小的日期范围进行过滤。例如,给我起始和结束范围在2017-01-28和2017-02-04之间的结果。

比如:

data start                data end
    |------------------------|
        |----------------|
   search start      search end

在我的研究中,我只能找到与搜索有关的答案,如果一个单一的日期落在一个范围内,而不是如果一个范围的任何部分落在另一个范围内。

这是我目前拥有的:

$closures = Closures::where('start_date', '>=', $from)->where('end_date', '<=', $to)->get();

这种方法的问题是它没有真正考虑到部分重叠。在上面的示例中,我的搜索日期确实大于或等于数据的日期,但由于结束日期实际上大于数据的结束日期,因此将不会返回。

最明显的做法是使用第二个条件和orWhere,但是这样就会返回所有小于日期的数据,这是行不通的。

我基本上需要检查我的搜索范围的任何部分是否落在数据的范围内。这是可能的吗?如果是的话,我怎么才能做到这一点呢?

您将检查所提供的两个日期中的任何一个是否在您的数据范围内。我会使用嵌套的地方,以避免任何逻辑溢出。

$closures = Closures::where(function($query) use ($start) {
    return $query->where('start_date', '<=', $start)->where('end_date', '>=', $start);
})
->orWhere(function($query) use ($end) {
    return $query->where('start_date', '<=', $end)->where('end_date', '>=', $end);
})
->get();