Многоуровневые отношения 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 ключ будет присутствовать, только если отношения были загружены.

Другие вопросы по тегам