Многоуровневые отношения Laravel в API Resource - PullRequest
0 голосов
/ 30 января 2019

Моя проблема в загрузке ресурсов 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
    ];
}

// controller

return BoxItemResource::collection(
        BoxItem::with([
            'item'
        ])->paginate(1)
    );

Моя проблема в том, что мне нужны только BoxItem и Item.Я действительно не хочу загружать условия.Если я удалю отношение условия из ItemResource.php, оно будет работать.но проблема в том, что я использую ItemResource.php в каком-то другом месте, где необходимо это условие.

Можно ли отрицать загрузку отношения условия загрузки здесь.

более четко, я хочу загрузитьотношения, которые я упоминаю в контроллере (в -> с ()).

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Ресурсы 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'))
];
0 голосов
/ 30 января 2019

Может быть, вы ищете Условные отношения ?

В идеале это должно выглядеть следующим образом:

public function toArray($request)
{
    return [
        'box_id'=> $this->box_id,
        'item' => ItemResource::collection($this->whenLoaded('item'))
    ];
}

Клавиша item будет присутствовать только в том случае, если отношение загружено.

...