PHP Laravel REST api двойное обратное отношение - PullRequest
0 голосов
/ 07 марта 2020

Я строю REST API, используя Laravel. В моей базе данных есть таблица с именем container. Контейнер имеет внешнюю связь с другой таблицей под названием Магазин. Наконец, есть таблица изображений, которая имеет внешний ключ к таблице магазинов. Я хочу иметь конечную точку для своих контейнеров, которая будет возвращать данные контейнера, включая данные из Магазина, которым он назначен, а также все изображения, назначенные магазину.

это мой ресурс Контейнера:

class Container extends JsonResource
{

    public function toArray($request)
    {

        return [
            'id' => $this->id,
            'shop_id' => $this->shop_id,
            'shop' => (new ShopResource($this->whenLoaded('shop')))
        ];
    }
}

это ресурс моего Магазина:

class Shop extends JsonResource
{

    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

а вот мой контроллер Контейнера:

class ContainerController extends Controller
{
    public function index()
    {
        return ContainerResource::collection(Container::with('shop')->get());
    }
}

В основном в Django все, что мне нужно было бы сделать, это присвоить related_name для модели изображения (например, related_name = "images"), и я бы получил все изображения, связанные с моделью магазина, в моей базе данных, используя, например, , Shop.objects.first (). Изображения, которые будут учтены в сериализаторе контейнеров. Как добиться того же эффекта с Laravel Rest API?

1 Ответ

0 голосов
/ 07 марта 2020

Для полной загрузки отношения сделайте.

Container::with('shop.images');

Для того, что я знаю о parent::toArray(), следует включить изображения в ShopResource, если не заполнить ресурс, аналогично тому, как это сделано с ContainerResource.

class Shop extends JsonResource
{

    public function toArray($request)
    {
        return [
            ...
            'images' => ImageResource::collection($this->whenLoaded('images')),
        ];
    }
}

Чтобы загружать несколько отношений, используя метод with, он также может принимать массив.

Container::with(['shop.images', 'shop.employees',]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...