Я хочу вернуть ключ и значение в коллекции Laravel - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть две модели (Store, Product) и Relationship hasMany

public function products(){
   return $this->hasMany(Product::class);
}

И я хочу вернуть коллекцию ответов, в классе StoresCollection расширяется ResourceCollection

public function toArray($request)
    {
        return $this->collection->map(function ($item) {
            return [
                'id' => $item->id,
                'seller_id' => $item->seller_id,
                'store_product' =>  $item->products()->get(),
            ];
        });
    }

Но я не Я не хочу возвращать каждый ключ в "store_product", мне просто нужны только "id" и "is_featured", и я не хочу их всех.

{
    "status": "success",
    "message": [],
    "code": 200,
    "data": [
        {
            "id": 5,
            "seller_id": 6,
            "store_product": [
                {
                    "id": 1017,
                    "seller_id": 89,
                    "is_featured": 0,
                    "is_category_featured": 0,
                    "is_approved": 1,
                    "created_at": "2020-4-21T00:00:00.000000Z",
                    "updated_at": "2020-4-21T00:00:00.000000Z"
                }
            ]
        },
        {
            "id": 5,
            "seller_id": 6,
            "store_product": [
                {
                    "id": 1018,
                    "seller_id": 89,
                    "is_featured": 0,
                    "is_category_featured": 0,
                    "is_approved": 1,
                    "created_at": "2020-4-21T00:00:00.000000Z",
                    "updated_at": "2020-4-21T00:00:00.000000Z"
                }
            ]
        },
    "paging": {
        "total": 2,
        "per_page": 15,
        "current_page": 1,
        "last_page": 1,
        "from": 1,
        "to": 2
    }
}

Ответы [ 4 ]

1 голос
/ 21 апреля 2020

Можно запросить только несколько столбцов методом get(), в вашем случае, например:

'store_product' =>  $item->products()->get(['id', 'is_featured']),
0 голосов
/ 21 апреля 2020

Это очень просто реализовать

'store_product' =>  $item->products()->value('id', 'is_featured'),
0 голосов
/ 21 апреля 2020

Вы также можете определить ключи, которые вы хотите вернуть в отношениях:

public function products(){
   return $this->hasMany(Product::class)->select(['store_id','id', 'is_featured']);
}

Примечание: Не забудьте добавить столбцы, назначенные внешнему ключу, соответствующие обеим таблицам. Например, в моем примере я предположил, что Store имеет Product, что означает, что столбцы, назначенные внешнему ключу, будут выглядеть примерно так: store.id = product.store_id, поэтому мне пришлось добавить store_id в список выбранных столбцов. ;

0 голосов
/ 21 апреля 2020

Создайте ресурс для store_product, например, StoreProductResource и определите ключи в методе toArray ().

Затем вернитесь и измените StoreCollection :: toArray () следующим образом:

 return $this->collection->map(function ($item) {
            return [
                'id' => $item->id,
                'seller_id' => $item->seller_id,

                'store_product' =>  StoreProductResource::collection($item->products()->get()),
            ];
        });

Я также считаю, что карта обратного вызова не нужна в вашем случае использования. toArray () просто нужно вернуть массив. Laravel обрабатывает сопоставление. За исключением некоторого логика c, который вы делаете в обратном вызове, который не включен в тот же код.

...