我在将关系加载到要由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'))
];
似乎最终奏效了。