Laravel Eloquent 获取哪里没有,当不为空时搜索哪里有

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)

问题是,这只能获取已预订且在指定日期之后可用的房间。我需要它能够搜索所有房间,如果确实有预订,请检查到期日期是否在指定日期之后,如果没有最新预订,则无论如何都要获取它,因为它是空房间。

基本上我将如何构建我的过滤器函数,以便它像这样运行

搜索所有房间,如果有最新预订,检查其到期日期是否在指定日期之后,仅在其真实/空置时才获取它,如果没有最新预订,则无论如何获取它,因为它是空置的

Chu*_*nya 5

我有一个关于你的建议给你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获取所有从未预订过的房间。