laravel Api 资源 Call to undefined method xxxxx::mapInto()

在使用Laravel Api资源的时候遇到这个坑

1.错误截图

2.错误代码

我用了with(['user','category'])预查询,然后想Transformer一下字段

3.展示模型关系

Article模型

public function category ()
{
    return $this->belongsToMany(Category::class)->withTimestamps();
}

public function user ()
{
    return $this->belongsTo(User::class);
}

User模型

public function article ()
{
    return $this->hasMany(Article::class,'user_id','id');
}

Category模型

public function article ()
{
    return $this->belongsToMany(Article::class)->withTimestamps();
}

4.查看查询出来的对象数据

这里我把$this打印了出来

为什么这里的user不是一个Collection呢??

原因一:因为我们这里是用Article去关联User查询数据,那么我们在Article模型中定义的关系是belongsTo,那么也就说明,我们查询出来的User只会是单个集合数据,不会是多个集合

下面来看一下官方文档eloquent-collections给的解释

所以我们这里调用User::collection($this->user)就会报错,因为这里的关系查询出来的$this->user压根就不是一个collection

5.修改代码

注意这里的User和Category是App\Http\Resources命名空间下的User,并不是模型

6.建议大家都用whenLoad的方式加载数据

whenLoaded 表示 有这组关联数据,才会去加载.否则不加载

public function toArray ($request)
{
    return [
    //.......
    'user' => new User($this->whenLoaded('user')),
     'category' => Category::collection($this->whenLoaded('category')),
    ]
}