Как использовать условные отношения в API Resource? - PullRequest
0 голосов
/ 19 ноября 2018

Я создал ресурс API:

class OrderResource extends JsonResource
{

    public function toArray($request)
    {
        return [
            "id" => $this->Id,
            "photo" => ''
        ];
    }
}

В контроллере я получаю данные из модели OrderModel положенные данные в ресурс OrderResource:

public function show($id)
{
        $order = OrderModel::with('OrderPhoto')->findOrFail(1);

        return new OrderResource($order);
}

Итак, япопытался использовать отношение OrderPhoto в OrderResource так:

public function toArray($request)
    {
        return [
            "id" => $this->Id,
            "photo" => OrderPhotoResource::collection($this->whenLoaded('OrderPhoto')),
        ];
    }

Но оно не работает и выдает эту ошибку:

Неопределенное свойство: Illuminate \ Database \ Query\ Builder :: $ map

Я сделал dd($this) в ресурсе и что я получил:

enter image description here

Класс OrderPhoto:

class OrderPhoto extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

1 Ответ

0 голосов
/ 19 ноября 2018

TL; DR

Попробуйте это в своем OrderResource:

use OrderPhoto as OrderPhotoResource;

//

public function toArray($request)
{
    return [
        "id" => $this->Id,
        "photo" => new OrderPhotoResource($this->whenLoaded('OrderPhoto')),
    ];
}

Пояснение

Как видите, вы уже определяете OrderPhoto как коллекция ресурсов:

class OrderPhoto extends ResourceCollection // <-- note the extended class

Таким образом, в этом случае вам нужно будет использовать этот класс для создания экземпляра класса и передачи в коллекцию вместо использования статического метода collection.

Когда вы определяете ресурс API для отдельного объекта, например:

php artisan make:resource PostResource

, вы используете его, как показано ниже:

$post = Post::find(1);

return new PostResource($post);

И если выЧтобы использовать API-ресурс для форматирования набора ресурсов вместо одного, вам нужно сделать следующее:

$posts = Post::all();

return PostResource::collection($posts); // <-- note the ::collection part

Управление метаданными

Если вычтобы иметь полный контроль над возвращенными метаданными в ответе, определите вместо этого пользовательский класс Коллекция ресурсов API .

Создайте класс как коллекцию (добавив в конце «Коллекция»)или используя флаг --collection):

php artisan make:resource PostResourceCollection

затем, после его настройки:

$posts = Post::all();

return new PostResourceCollection($posts); // <-- instantiating the class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...