[英]Pass Eloquent pivot value to Laravel API resource
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());
}
CatResource:
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
之前,首先在控制器中獲取此信息。
我更喜歡第二種方式,但看不出怎么做。
嘗試條件關系 。
public function toArray($request)
{
return [
'id' => $this->id,
'borrowed' => false,
'borrowed' => $this->whenPivotLoaded('cat_owner', function () {
return $this->owner_id === auth()->id() && $this->pivot->borrowed == 1 ? true : false;
})
];
}
然后調用return CatResource::collection(Cat::with('owners')->get());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.