Laravel 获取相关模型的相关模型

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24553196/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 09:45:44  来源:igfitidea点击:

Laravel get related models of related models

phprestlaravellaravel-4eloquent

提问by Tom Macdonald

I have a RepairRequest model, which is associated with a Vehicle.

我有一个 RepairRequest 模型,它与车辆相关联。

class RepairRequest extends \Eloquent {
    public function vehicle() {
        return $this->belongsTo('Vehicle');
    }
}


class Vehicle extends \Eloquent {
    public function requests() {
        return $this->hasMany('RepairRequest');
    }
}

I would like to get all RepairRequests for the vehicle associated with a given RepairRequest, so I do

我想获得与给定 RepairRequest 相关联的车辆的所有 RepairRequests,所以我这样做

return RepairRequests::find($id)->vehicle->requests;

This works fine.

这工作正常。

However, RepairRequests have RepairItems:

然而,RepairRequests 有 RepairItems:

// RepairRequest class
public function repairItems() {
    return $this->hasMany('RepairItem', 'request_id');
}

// RepairItem class
public function request() {
    return $this->belongsTo('RepairRequest', 'request_id');
}

which I would like to return too, so I do

我也想回来,所以我做

return RepairRequests::find($id)->vehicle->requests->with('repairItems');

but I get the following exception:

但我收到以下异常:

Call to undefined method Illuminate\Database\Eloquent\Collection::with()

How can I write this so that the returned json includes the RepairItems in the RepairRequest json?

我该如何编写,以便返回的 json 包含 RepairRequest json 中的 RepairItems?

回答by Jarek Tkaczyk

Load related models using loadmethod on the Collection:

使用load集合上的方法加载相关模型:

return RepairRequests::find($id)->vehicle->requests->load('repairItems');

which is basically the same as:

这基本上与以下内容相同:

$repairRequest = RepairRequests::with('vehicle.requests.repairItems')->find($id);

return $repairRequest->vehicle->requests;

回答by user1669496

I'd suggest eager loading everything.

我建议急切地加载所有内容。

return RepairRequests::with('vehicle.requests.repaireItems')->find($id);