我想 return Laravel 集合中的一些键和值
I want to return some key and value in the Laravel collection
我有两个模型(商店、产品)和关系 hasMany
public function products(){
return $this->hasMany(Product::class);
}
而且我想return响应集合,在class StoresCollection extends 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(),
];
});
}
但我不想 return "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
}
}
为 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() 只需要 return 一个数组。 Laravel 处理映射。除了您在回调中执行的某些逻辑未包含在同一代码中。
您也可以在关系中定义您想要 return 的键:
public function products(){
return $this->hasMany(Product::class)->select(['store_id','id', 'is_featured']);
}
注意:记得添加分配给匹配两个表的外键的列。例如,在我的示例中,我假设 Store
有一个 Product
,这意味着分配给外键的列类似于 store.id = product.store_id
,所以我必须添加 [=14] =] 到所选列的列表;
可以通过 get()
方法仅请求某些列,在您的情况下,例如:
'store_product' => $item->products()->get(['id', 'is_featured']),
这个实现起来很简单
'store_product' => $item->products()->value('id', 'is_featured'),
我有两个模型(商店、产品)和关系 hasMany
public function products(){
return $this->hasMany(Product::class);
}
而且我想return响应集合,在class StoresCollection extends 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(),
];
});
}
但我不想 return "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
}
}
为 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() 只需要 return 一个数组。 Laravel 处理映射。除了您在回调中执行的某些逻辑未包含在同一代码中。
您也可以在关系中定义您想要 return 的键:
public function products(){
return $this->hasMany(Product::class)->select(['store_id','id', 'is_featured']);
}
注意:记得添加分配给匹配两个表的外键的列。例如,在我的示例中,我假设 Store
有一个 Product
,这意味着分配给外键的列类似于 store.id = product.store_id
,所以我必须添加 [=14] =] 到所选列的列表;
可以通过 get()
方法仅请求某些列,在您的情况下,例如:
'store_product' => $item->products()->get(['id', 'is_featured']),
这个实现起来很简单
'store_product' => $item->products()->value('id', 'is_featured'),