Ларавел 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 возможных способа:
Передать $owner
в CatResource
(требуется переопределение существующего ресурса сбора).
Сначала получите эту информацию в контроллере, прежде чем перейти к CatResource
.
Я предпочитаю второй способ, но не вижу, как это сделать.