Передайте значение Eloquent Pivot в ресурс Laravel API - PullRequest
0 голосов
/ 03 апреля 2019

Ларавел 5.7.У меня есть 2 модели Eloquent: Владелец, Cat.

Модель владельца:

public function cats()
{
    return $this->belongsToMany('App\Cat')->withPivot('borrowed');
}

Модель Cat:

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 кошек.Есть ли более эффективный способ сделать это?Я могу придумать 2 возможных способа:

  1. Передать $owner в CatResource (требуется переопределение существующего ресурса сбора).

  2. Сначала получите эту информацию в контроллере, прежде чем перейти к CatResource.

Я предпочитаю второй способ, но не вижу, как это сделать.

1 Ответ

0 голосов
/ 03 апреля 2019

Попробуйте Условные отношения .

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());

...