В JSON-объекты можно заносить:
public function toArray() { return [ 'key' => $this->id, 'title'=> $this->name, ... ]; }
return [ ..., 'product_counts' => $this->products()->count() ];
return [ ..., 'powered_by' => 'Laravel' ];
Для вычислений по условию можно воспользоваться специальными ресурсными методами: when
, mergeWhen
:
return [ 'count' => $this->when($this->products()->exists(), $this->products()->count()), 'secret' => $this->when(Auth::user()->isAdmin(), 'secret-value'), ];
Вместо выводимого значения (второй входящий параметр метода when
), можно использовать анонимную функцию:
return [ ..., 'count' => $this->when($this->products()->exists(), function(){ return $this->products()->count(); }) ];Если есть несколько атрибутов, которые должны быть включены в ответ ресурса только на основе одного и того же условия, то можно использовать метод
mergeWhen
для включения атрибутов в ответ только тогда, когда данное условие истинно:
public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, $this->mergeWhen(Auth::user()->isAdmin(), [ 'first-secret' => 'value', 'second-secret' => 'value', ]), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }
return [ ... 'parent' => new ProductResource($this->parent) ];
return [ ... 'products' => new ProductResourceCollection($this->products) ];
use App\Http\Resources\PostResource; /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'posts' => PostResource::collection($this->posts), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }В том числе в связях "многие-со-многими":
return [ ... 'products' => $this->pivot->products ];
whenLoaded
use App\Http\Resources\PostResource; /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'posts' => PostResource::collection($this->whenLoaded('posts')), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }В дополнение к условному включению сведений об отношениях в ответы вашего ресурса вы можете условно включить данные из промежуточных таблиц отношений многие ко многим, используя метод whenPivotLoaded. Метод whenPivotLoaded принимает имя сводной таблицы в качестве первого аргумента. Вторым аргументом должно быть замыкание, которое возвращает значение, которое будет возвращено, если в модели доступна сводная информация:
** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'expires_at' => $this->whenPivotLoaded('role_user', function () { return $this->pivot->expires_at; }), ]; }
Практика