如何解决获取两个日期之间的日期并返回 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);
});
})
->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
添加:
另看你的stacked 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 <=
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。