我正在使用Laravel 5.4。
我的预订模型包含start_date
和end_date
。用户从下拉列表中选择一个月。
我希望Eloquent
返回月份介于start_date
和end_date
边界之间的所有记录。
例如显示9月份的所有预订(即使预订在9月之前(或9月期间)开始,并且(布尔)在9月或之后结束。
欢迎提出任何建议。如果需要,很高兴成为一个原始的SQL语句。
答案 0 :(得分:1)
这对我有用:
$start = Carbon::now()->addMonth(-1);
$end = Carbon::now()->addMonth();
$bookings = Booking::whereRaw('MONTH(created_at) > :0 AND MONTH(created_at) < :1',[
$start->month, $end->month
])
->orWhereRaw('MONTH(created_at) = :3 AND DAYOFMONTH(created_at) >= :4', [
$start->month, $start->day
])
->orWhereRaw('MONTH(created_at) = :5 AND DAYOFMONTH(created_at) <= :6', [
$end->month, $end->day
])
->get();
如果您要排除开始日期和结束日期,可以将>=
替换为>
,将<=
替换为<
。
当然,您必须更改$start
和$end
日期。它们应该是Carbon\Carbon
个对象。
答案 1 :(得分:0)
首先,在客户端或服务器端将用户选择月份解析为:
$selected = "2017-09";
然后:
Booking::where([
['start_time','>', $selected],
['end_time','<', $selected]
])->get()
答案 2 :(得分:0)
这似乎有效:
$bookings = DB::table('bookings')
->whereMonth('start_date', '<', $date->month)->whereMonth('end_date', '>=', $date->month)
->orWhere(function($query) use ($date) {
$query->whereMonth('start_date', $date->month);
})->get();
答案 3 :(得分:0)
应该非常简单。
我不确定&#34;月&#34;是什么格式?但是您应该使用DateTime::createFromFormat()
来获取DateTime
对象。如果您熟悉,请随意使用Carbon
。我发现像这样的简单事情,它增加了不必要的复杂性。
然后使用它进行查询。
Booking::whereBetween($dateTime->format('Y-m-00'), [DB::raw('start_date'), DB::raw('end_date')])->get();
答案 4 :(得分:0)
添加一些解释:
Booking::whereRaw("(start_date, end_date) overlaps (date '2021-06-01', date '2021-06-30')")->get();