我想在 Laravel 集合中返回一些键和值

Posted

技术标签:

【中文标题】我想在 Laravel 集合中返回一些键和值【英文标题】:I want to return some key and value in the Laravel collection 【发布时间】:2020-04-21 09:24:24 【问题描述】:

我有两个模型(商店、产品)和关系 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
    

【问题讨论】:

【参考方案1】:

可以通过get() 方法仅请求某些列,在您的情况下,例如:

'store_product' =>  $item->products()->get(['id', 'is_featured']),

【讨论】:

【参考方案2】:

为 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 处理映射。除了您在回调中执行的某些逻辑未包含在同一代码中。

【讨论】:

【参考方案3】:

您也可以定义要在关系中返回的键:

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

注意:记得添加分配给匹配两个表的外键的列。例如,在我的示例中,我假设Store 具有Product,这意味着分配给外键的列将类似于store.id = product.store_id,因此我必须将store_id 添加到选定列的列表中;

【讨论】:

【参考方案4】:

这个实现起来很简单

'store_product' =>  $item->products()->value('id', 'is_featured'),

【讨论】:

以上是关于我想在 Laravel 集合中返回一些键和值的主要内容,如果未能解决你的问题,请参考以下文章

枚举字典迭代键和值[重复]

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

php和laravel数组指定元素作为键和值

Json 中的键和值

获取map集合中的键和值

关联数组中的PHP三元语句来设置键和值?