【发布时间】:2019-08-25 01:29:38
【问题描述】:
Laravel 5.7。我有 2 个 Eloquent 模型:所有者、猫。
所有者模型:
public function cats()
{
return $this->belongsToMany('App\Cat')->withPivot('borrowed');
}
猫模型:
public function owners()
{
return $this->belongsToMany('App\Owner')->withPivot('borrowed');
}
cat_owner 数据透视表具有以下字段:
id | cat_id | owner_id | borrowed
---------------------------------
1 | 3 | 2 | 1
我希望我的 API 返回所有猫的列表,如果登录用户借用了这只猫,我希望将 borrowed 字段设置为 true。这是我目前所拥有的:
控制器:
public function index()
{
return CatResource::collection(Cat::all());
}
猫资源:
public function toArray()
{
$data = ['id' => $this->id, 'borrowed' => false];
$owner = auth()->user();
$ownerCat = $owner->cats()->where('cat_id', $this->id)->first();
if ($ownerCat) {
$data['borrowed'] = $ownerCat->pivot->borrowed == 1 ? true : false;
}
return $data;
}
这可行,但为每只猫请求$owner 似乎很浪费,例如如果数据库中有 5000 只猫。有没有更有效的方法来做到这一点?我可以想到两种可能的方法:
将
$owner传递给CatResource(需要覆盖现有的集合资源)。首先在控制器中获取此信息,然后再传递给
CatResource。
我更喜欢第二种方式,但不知道该怎么做。
【问题讨论】:
-
如果没有猫和登录所有者的数据透视记录,结果不应该包含
borrowed字段?
标签: php laravel api eloquent pivot-table