S_R*_*S_R 2 php laravel eloquent laravel-5
这个问题实在是很难说清楚,所以我对这个标题表示歉意!
假设我有一个Rooms模型和一个Bookings模型,1 个房间可以有多个预订。
我正在构建一个带有过滤器的表,如果有预订,我需要能够对预订关系运行过滤器,否则无论如何都会获取记录。
假设我的房间有这样的预订关系
public function latestBooking(){
return $this->hasOne('App\Models\Bookings', 'room_id', 'id')
->orderBy('expiry_date', 'DESC')->limit(1);
}
Run Code Online (Sandbox Code Playgroud)
上述关系为我提供了最新的预订。
我正在运行“空缺”过滤器,如下所示
if ($request->has('filters.vacant_from')) {
$rooms = $rooms->whereHas('latestBooking', function ($query) use ($request) {
$query->where('expiry_date', '<', Carbon::createFromFormat('d/m/Y',$request->input('filters.vacant_from'))->format('Y-m-d'));
});
}
Run Code Online (Sandbox Code Playgroud)
问题是,这只能获取已预订且在指定日期之后可用的房间。我需要它能够搜索所有房间,如果确实有预订,请检查到期日期是否在指定日期之后,如果没有最新预订,则无论如何都要获取它,因为它是空房间。
基本上我将如何构建我的过滤器函数,以便它像这样运行
搜索所有房间,如果有最新预订,检查其到期日期是否在指定日期之后,仅在其真实/空置时才获取它,如果没有最新预订,则无论如何获取它,因为它是空置的
我有一个关于你的建议给你latestBookingRelationship。您应该创建另一个关系并向greater than today其添加一个条件,也许还可以为其命名activeLatestBooking。
那么,您最新的预订应包含所有预订房间,无论其预订是否有效。
public function activeLatestBooking(){
return $this->hasOne('App\Models\Bookings', 'room_id', 'id')
->where('expiry_date', '>', date('d/m/Y', strtotime('today')))->orderBy('expiry_date', 'DESC')->limit(1);
}
public function latestBooking(){
return $this->hasOne('App\Models\Bookings', 'room_id', 'id')
->orderBy('expiry_date', 'DESC')->limit(1);
}
Run Code Online (Sandbox Code Playgroud)
然后,回答你的问题:
if ($request->has('filters.vacant_from')) {
$rooms = $rooms->whereHas('latestBooking', function ($query) use ($request) {
$query->where('expiry_date', '<', Carbon::createFromFormat('d/m/Y',$request->input('filters.vacant_from'))->format('Y-m-d'));
})->orWhereDoesntHave('latestBooking');
}
Run Code Online (Sandbox Code Playgroud)
过滤器查询的作用是这样的:它获取所有expiry_date小于该vacant_from日期的最新预订......并orWhereDoesntHave获取所有从未预订过的房间。
| 归档时间: |
|
| 查看次数: |
8049 次 |
| 最近记录: |