加载属于laravel资源集合内部的关系



我在将关系加载到要由API使用的ResourceCollection中时遇到了一些问题,我想加载每个属于一个类别的博客。

使用belongsTo关系的博客模型

<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsTo;
use IlluminateDatabaseEloquentSoftDeletes;
class BlogPost extends Model {
use HasFactory, SoftDeletes;
protected $fillable = [
'title',
'content',
'seo_title',
'seo_content',
];
public function categories(): BelongsTo {
return $this->belongsTo(BlogCategory::class);
}
}

Category模型有一个hasMany到博客

<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsHasMany;
class BlogCategory extends Model {
use HasFactory;
protected $fillable = [
'slug'
];
public function blogs(): HasMany {
return $this->hasMany(BlogPost::class);
}
}

在blog_post迁移中,我为blog_categories 添加了一个外键

$table->foreignId('category_id')->constrained('blog_categories');

然后,在我的BlogPost资源收集中,我尝试加载关系

#[ArrayShape(['data' => "IlluminateSupportCollection", 'category' => AnonymousResourceCollection::class])] public function toArray($request): array {
return [
'data' => $this->collection,
'category' => BlogCategoryCollection::make($this->whenLoaded($this->categories))
];
}

我调用我的控制器的索引函数内部的集合

public function index(): BlogPostCollection
{
return new BlogPostCollection(BlogPost::all());
}

当我到达api/blogs端点时,我会得到错误:

Property [categories] does not exist on this collection instance. 

最终设法修复了它。

将BlogPostResourceCollection更改为以下

return [
'data' => $this->collection,
'categories' => BlogCategoryCollection::collection($this->whenLoaded('categories'))
];

似乎最终奏效了。

最新更新