Laravel格式资源集合响应错误属性[product_id]在此集合实例上不存在
Laravel format resource collection response error Property [product_id] does not exist on this collection instance
在 laravel 中,我们可以格式化来自资源 class 的 json 响应,如下所示
class ProductsResource extends JsonResource
{
public function toArray($request)
{
return [
'id'=> $this->product_id ,
'code'=> $this->product_code,
'shortdescription'=> $this->product_short_description,
'image'=> $this->product_image,
];
}
}
但是当返回资源集合时我无法格式化我的集合错误属性[product_id]在此集合实例上不存在
class ProductsResource extends ResourceCollection
{
public function toArray($request)
{
return [
'id'=> $this->product_id ,
'code'=> $this->product_code,
'shortdescription'=> $this->product_short_description,
'image'=> $this->product_image,
];
}
}
谢谢。
这是因为 ResourceCollection
需要 collection
个项目而不是 single item
。集合资源希望您遍历集合并且不能直接从 $this
(因为它是一个集合)执行单个实体例程。
See resource collections in documentation
您可能正在寻找的是投射自定义突变,可以在此处找到示例:
See custom casts in documentation
Look/search Value Object Casting
。它详细解释了如何改变 get
和 set
上的属性,这可能比资源集合更好(如果这是您唯一想用它做的事情)。这将立即修改集合,使您不必在每次需要时手动实例化资源集合(因为您在模型级别进行修改)。
来自文档:
Value Object Casting
You are not limited to casting values to primitive types. You may also cast values to objects. Defining custom casts that cast values to objects is very similar to casting to primitive types; however, the set method should return an array of key / value pairs that will be used to set raw, storable values on the model.
但是回到主题...
如果你倾倒而死:dd($this);
你会看到有一个名为 +collection
的属性
如果您希望转换键或值,则必须遍历 $this->collection
以便将集合 values
或 keys
转换为您的要求。
正如您在父 class Illuminate\Http\Resources\Json\ResourceCollection
中看到的那样,方法 toArray()
已经是一个映射集合。
其中你可以看到它指向 $this->collection
/**
* Transform the resource into a JSON array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return $this->collection->map->toArray($request)->all();
}
您可以使用类似下面的内容。并更新此集合映射中的 item/key 值。
return $this->collection->map(function($item, $key){})->toArray();
如果您希望在将值返回到数组之前转换这些值。
或者像这样的简单 foreach(没有测试过,有更好的方法)但是为了分享一个 simple-to-grasp
示例:
$result = [];
// Map the associations to be modified
$resultMap = [
'product_id' => 'id',
'product_code' => 'code',
'product_short_description' => 'shortdescription',
'product_image' => 'image'
];
// Iterate through the collection
foreach ($this->collection as $index => $item)
foreach ($item as $key => $value)
$result[$index][$resultMap[$key]] = $value;
return $result;
在 laravel 中,我们可以格式化来自资源 class 的 json 响应,如下所示
class ProductsResource extends JsonResource
{
public function toArray($request)
{
return [
'id'=> $this->product_id ,
'code'=> $this->product_code,
'shortdescription'=> $this->product_short_description,
'image'=> $this->product_image,
];
}
}
但是当返回资源集合时我无法格式化我的集合错误属性[product_id]在此集合实例上不存在
class ProductsResource extends ResourceCollection
{
public function toArray($request)
{
return [
'id'=> $this->product_id ,
'code'=> $this->product_code,
'shortdescription'=> $this->product_short_description,
'image'=> $this->product_image,
];
}
}
谢谢。
这是因为 ResourceCollection
需要 collection
个项目而不是 single item
。集合资源希望您遍历集合并且不能直接从 $this
(因为它是一个集合)执行单个实体例程。
See resource collections in documentation
您可能正在寻找的是投射自定义突变,可以在此处找到示例:
See custom casts in documentation
Look/search Value Object Casting
。它详细解释了如何改变 get
和 set
上的属性,这可能比资源集合更好(如果这是您唯一想用它做的事情)。这将立即修改集合,使您不必在每次需要时手动实例化资源集合(因为您在模型级别进行修改)。
来自文档:
Value Object Casting
You are not limited to casting values to primitive types. You may also cast values to objects. Defining custom casts that cast values to objects is very similar to casting to primitive types; however, the set method should return an array of key / value pairs that will be used to set raw, storable values on the model.
但是回到主题...
如果你倾倒而死:dd($this);
你会看到有一个名为 +collection
如果您希望转换键或值,则必须遍历 $this->collection
以便将集合 values
或 keys
转换为您的要求。
正如您在父 class Illuminate\Http\Resources\Json\ResourceCollection
中看到的那样,方法 toArray()
已经是一个映射集合。
其中你可以看到它指向 $this->collection
/**
* Transform the resource into a JSON array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return $this->collection->map->toArray($request)->all();
}
您可以使用类似下面的内容。并更新此集合映射中的 item/key 值。
return $this->collection->map(function($item, $key){})->toArray();
如果您希望在将值返回到数组之前转换这些值。
或者像这样的简单 foreach(没有测试过,有更好的方法)但是为了分享一个 simple-to-grasp
示例:
$result = [];
// Map the associations to be modified
$resultMap = [
'product_id' => 'id',
'product_code' => 'code',
'product_short_description' => 'shortdescription',
'product_image' => 'image'
];
// Iterate through the collection
foreach ($this->collection as $index => $item)
foreach ($item as $key => $value)
$result[$index][$resultMap[$key]] = $value;
return $result;