获取两个日期之间的日期并返回Laravel中可用的资源



我有一个奇怪的查询,我需要在Laravel中运行。

我需要获取从当前日期到接下来两周的每一天,然后基于这些天,我需要返回每天可用的资源。当我使用单个日期作为开始和结束日期时,它可以工作,但在多个日期时,它不返回任何资源。

首先在我的控制器中创建一个日期范围,如下所示:

$availabilityRange = CarbonPeriod::create(Carbon::now()->startOfDay(), Carbon::now()->addDays(14)->startOfDay()); 

对于具有一天开始和一天结束的单个日期,我像这样检索它,它会返回仅为该日期未预订的资源:

$start_date = Carbon::tomorrow()->startOfDay();
$end_date = Carbon::tomorrow()->endOfDay(); 

然后循环查看我的预订以检查哪些资源可用,如下所示:

$resource = Resource::join('resource_teachers', 'resources.id', '=', 'resource_teachers.resource_id')
->where('resource_teachers.subject_id', $id)
->where('resource_subjects.deleted_at', NULL)
->select("resources.name", "resources.surname", "resources.id")
->whereNotExists(function ($query) use ($start_date, $end_date) {
$query
->select(DB::raw(1))
->from('bookings')
->whereRaw('bookings.resource_id = resources.id')
->where(function ($query) use ($start_date, $end_date) {
$query
->whereRaw('bookings.resource_id = resources.id')
->where('bookings.start_date', '<=', $start_date)
->where('bookings.end_date', '>=', $start_date);
})->orWhere(function ($query) use ($start_date, $end_date) {
$query
->whereRaw('resource_id = resources.id')
->where('bookings.start_date', '<=', $end_date)
->where('bookings.end_date', '>=', $end_date);
})->orWhere(function ($query) use ($start_date, $end_date) {
$query
->whereRaw('resource_id = resources.id')
->where('bookings.start_date', '>=', $start_date)
->where('bookings.end_date', '<=', $end_date);
});
})
->get(); 

然后我在我的刀片文件中显示资源,像这样:

@foreach($availabilityRange as $date)
<tr>
<td>
{{ $date->toDateString() }}
</td>
<td>
@if(($date == $start_date))
@foreach($resource as $availableResource)
<div class="badge badge-primary mr-1 mb-1">{{ $availableResource->name }} {{ $availableResource->surname }}</div>
@endforeach
@endif
</td>
</tr>
@endforeach

如果我像这样尝试获取多个天的资源,它将不显示任何内容:

$start_date = new DateTime(Carbon::now()->startOfDay());
$end_date   = new DateTime(Carbon::now()->addDays(14)->startOfDay());

我也试过了,但是没有效果:

foreach ($availabilityRange as $start_date) {
$start_date->startOfDay()->toArray();
}
foreach ($availabilityRange as $end_date) {
$end_date->endOfDay()->toArray();
}

我做错了什么?

对于单一的一天,您将获得像这样的开始和结束日期:

$start_date = Carbon::tomorrow()->startOfDay();
$end_date = Carbon::tomorrow()->endOfDay(); 

但是对于许多天,你得到的是这样的(与DateTime):

$start_date = new DateTime(Carbon::now()->startOfDay());
$end_date   = new DateTime(Carbon::now()->addDays(14)->startOfDay());

要运行查询,您需要一个Carbon实例,因此尝试将上面的代码更改为:

$start_date = Carbon::now()->startOfDay();
$end_date   = Carbon::now()->addDays(14)->startOfDay();

参见whereDay()和其他你可能在文档中发现有用的where子句:https://laravel.com/docs/8.x/queries#additional-where-clauses

补充道:

也看到你堆叠的where()->orWhere()->orWhere()...,我认为你需要改变一些变量和条件,例如:

->where(function ($query) use ($start_date, $end_date) {
$query
->whereRaw('bookings.resource_id = resources.id')
->where('bookings.start_date', '<=', $start_date) // should be  >=
->where('bookings.end_date', '>=', $start_date); // should be $end_date and <=
})

最新更新