簡體   English   中英

將Eloquent pivot值傳遞給Laravel API資源

[英]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只貓。 有沒有更有效的方法來做到這一點? 我可以想到兩種可能的方法:

  1. $owner傳遞給CatResource (需要覆蓋現有的集合資源)。

  2. 在傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM