Многоуровневые отношения Laravel в API Resource
Моя проблема в загрузке ресурсов API, которая мне действительно не нужна. Посмотрите на мои файлы ресурсов Api
//BoxItemResource.php
public function toArray($request)
{
return [
'box_id'=> $this->box_id,
'item_id'=> $this->item_id,
'item'=> new ItemResource($this->item)
];
}
//ItemResource.php
public function toArray($request)
{
return [
'id' => $this->id,
'shipping_price' => $this->shipping_price,
'condition_id' => $this->condition_id,
'condition' => new ConditionResource($this->condition)
];
}
//ConditionResource.php
public function toArray($request)
{
return [
'id'=> $this->id,
'name'=> $this->name
];
}
// контроллер
return BoxItemResource::collection(
BoxItem::with([
'item'
])->paginate(1)
);
Моя проблема в том, что мне нужны только BoxItem и Item. Я действительно не хочу загружать условия. Если я удалю отношение условия из ItemResource.php, оно будет работать. но проблема в том, что я использую ItemResource.php в каком-то другом месте, где нужно это условие.
Можно ли здесь отрицать отношение загрузки к кораблю?
более ясно, я хочу загрузить отношения, которые я упоминаю в контроллере (в ->with()) .
Заранее спасибо.
2 ответа
Ресурсы API допускают условные атрибуты и условные отношения.
Для атрибутов, которые, по моему мнению, достаточно использовать в вашем случае, это означает, что вы можете просто обернуть значение атрибута в $this->when($condition, $value)
и весь атрибут будет удален из результата, если $condition == false
, Итак, конкретный пример вашего кода:
return [
'box_id'=> $this->box_id,
'item_id'=> $this->item_id,
'item'=> $this->when($this->relationLoaded('item'), new ItemResource($this->item))
];
Или, если вы предпочитаете использовать стиль отношений:
return [
'box_id'=> $this->box_id,
'item_id'=> $this->item_id,
'item'=> new ItemResource($this->whenLoaded('item'))
];
Может быть, вы ищете условные отношения?
В идеале это должно выглядеть следующим образом:
public function toArray($request)
{
return [
'box_id'=> $this->box_id,
'item' => ItemResource::collection($this->whenLoaded('item'))
];
}
item
ключ будет присутствовать, только если отношения были загружены.