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

时间:2016-11-04 19:50:09

标签: php laravel laravel-5.2

我很擅长使用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,但随后返回所有数据,其中所有数据都小于日期,但不起作用。

我基本上需要检查搜索范围的任何部分是否属于数据范围。这是否有可能,如果是这样,任何有关如何实现这一目标的想法。

1 个答案:

答案 0 :(得分:2)

您将检查提供的2个日期中是否有任何一个属于数据范围。我会使用嵌套的数据来避免任何逻辑溢出。

$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();
相关问题