多个 Laravel 关系的条件

Conditionals on multiple Laravel relationships

我得到 table 调用 Vehicles 在其模型 Vehicle 中定义了两个关系。

public function type(){
        return $this->belongsTo("App\VehiclePivot", 'vehicle_type_id', "id");
    }

public function workOrganization(){
        return $this->belongsTo("App\WorkOrganization", 'workOrganization_id', "id");
    }

用作

$vehicles = Vehicle::with("type", "workOrganization");

他们工作得很好。显示每辆车的类型和工作组织。

如果我尝试

$vehicles = Vehicle::whereHas("type", function($query) use($request){
                            $query->where('name', '=', $request->type);
                        })->with("type")->get();

$vehicles = Vehicle::whereHas("workOrganization", function($query) use($request){
                            $query->where('name', '=', $request->workOrg);
                        })->with("workOrganization")->get();

它们也有效。

用户可以输入 type 或 workOrganization,或者两者都输入,或者两者都不输入。

如果一个存在,那么只有那个关系应该“执行”,如果两者都有,那么两个关系都应该执行,如果它们都不存在,那么也应该执行。

可以通过eloquent完成吗?

我觉得你可以用 when

$vehicles = Vehicle::when(!empty($request->workOrg),function ($query) use($request){
        $query->whereHas("workOrganization", function($query) use($request){
            $query->where('name', '=', $request->workOrg);
        });
    })->when(!empty($request->type),function ($query) use($request){
        $query->whereHas("type", function($query) use($request){
            $query->where('name', '=', $request->type);
        });
    })
        ->with("workOrganization","type")
        ->get();