【发布时间】:2021-10-03 05:51:52
【问题描述】:
我有一些奇怪的查询需要在 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();
}
我做错了什么?
【问题讨论】:
标签: laravel laravel-7 php-carbon