Laravel 5.7.我有2口才模型:主人,猫
所有者型号:
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只猫。有没有更有效的方法来做到这一点?我可以想到两种可能的方法:
1.将$owner
传递给CatResource
(需要重写现有集合资源)。
1.在传递给CatResource
之前,首先在控制器中获取此信息。
我喜欢第二种方法,但不知道该怎么做。
2条答案
按热度按时间eit6fx6z1#
尝试条件关系。
然后调用
return CatResource::collection(Cat::with('owners')->get());
4bbkushb2#
你是对的,这会增加很多额外的负载。我认为你遇到了一个限制,那就是你不知道你想要哪个记录表单 cat_owner,直到你知道你正在使用的记录来自 cat 和 owner 表。
对于任何仍然感兴趣的人,我的解决方案是创建一个只提供透视值的资源
由于以下语句返回集合,因此您无法转到该集合上的透视表:
您应该接收集合,然后可以读取所有者记录的资源中的透视数据。如果此资源仅用于透视数据,我将其称为类似属性的东西。
为属性创建一个新资源,类似于:
然后像这样接收集合:
无法运行此代码,所以请指出错误,如果你尝试它,它给你任何,我会调整。