Laravel资源中能否直接展示嵌套关联,无需中间pivot资源?
在Laravel API Resources中直接返回关联的主模型资源(跳过中间表模型)
方法一:定义直接的多对多关联(推荐)
在Report模型中直接定义与Country的多对多关联,同时指定中间表和中间模型(如需保留中间表附加字段):
// app/Models/Report.php use App\Models\Country; use App\Models\ReportCountry; class Report extends Model { // 其他模型代码... public function countries() { return $this->belongsToMany(Country::class, 'report_countries') ->using(ReportCountry::class) // 指定中间表模型 ->withPivot('附加字段1', '附加字段2'); // 需携带中间表字段时添加 } }
使用步骤:
- 控制器中预加载该关联:
$report = Report::with('countries')->findOrFail($id); return new ReportResource($report);
- 在
ReportResource中直接返回CountryResource集合:
// app/Http/Resources/ReportResource.php use App\Http\Resources\CountryResource; class ReportResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, // 其他Report字段... 'countries' => CountryResource::collection($this->countries), ]; } }
若需在CountryResource中展示中间表字段,可通过$this->pivot直接访问:
// app/Http/Resources/CountryResource.php class CountryResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, '附加字段' => $this->pivot->附加字段1, ]; } }
方法二:在资源中直接提取关联模型(无需修改模型)
如果不想新增关联,可在ReportResource中从中间模型集合里提取Country模型实例:
// app/Http/Resources/ReportResource.php use App\Http\Resources\CountryResource; class ReportResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, // 其他Report字段... 'countries' => CountryResource::collection( $this->reportCountries->pluck('countryEntity') ), ]; } }
注意事项:
必须确保查询时预加载了嵌套关联,避免N+1问题:
$report = Report::with('reportCountries.countryEntity')->findOrFail($id);
内容的提问来源于stack exchange,提问作者WellBloud
相关产品推荐
相关产品推荐

