laravel - 如何在 laravel 中格式化 $with 数据
问题描述
我有 3 个表,一个 Shirts 表,一个 Size 表,以及一个连接它们的表,称为 Shirt_Sizes。衬衫可以有许多不同的尺码,而尺码可以有许多不同的衬衫。
我试图做到这一点,以便每当调用 Shirt 请求时,响应也会返回大小。我目前通过在我的衬衫模型中使用受保护的 $with 衬衫尺寸来做到这一点:
protected $with = ['sizes:size'];
截至目前,我的回复如下所示:
{
"id": 1,
"item_name": "A good Shirt",
"item_description": "Description"
"item_cost": "150.00",
"item_sizes": [
{
"size": "SM"
},
{
"size": "LG"
}
]
}
我希望它看起来像这样:
{
"id": 1,
"item_name": "A good Shirt",
"item_description": "Description"
"item_cost": "150.00",
"item_sizes": ["SM", "LG"]
}
我怎样才能做到这一点?
- -编辑 - -
有关更多上下文,这里是我的衬衫模型目前的样子
class Shirt extends Model
{
protected $fillable = ['item_name', 'item_description', 'item_cost'];
protected $with = ['sizes'];
public function sizes() {
return $this->belongsToMany(Size::class, 'shirt_sizes', 'shirt_id', 'size_id')->select('size');
}
}
我尝试在我的尺寸函数中使用 pluck 但这似乎不起作用
public function sizes() {
return $this->belongsToMany(Size::class, 'shirt_sizes', 'shirt_id', 'size_id')->select('size')->pluck('size');
}
解决方案
Collection 方法pluck
完全符合您的描述。它检索数组中特定键的所有值。
您可以item_sizes
像这样在您的财产上使用它:
Shirt::with('sizes')->first()->item_sizes->pluck('size');
对于您的用例,我建议使用Eloquent resources。它们的目的是为 API 响应转换任何数据集。
use Illuminate\Http\Resources\Json\JsonResource;
class Shirt extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'item_name' => $this->item_name,
'item_description' => $this->item_description,
'item_cost' => $this->item_cost,
'item_sizes' => $this->sizes->pluck('size'),
];
}
}
像这样在你的控制器中使用它:
$shirts = Shirt::with('sizes')->get();
return ShirtResource::collection($shirts);
这将完全按照您的描述返回您的集合,但不会修改模型本身。
推荐阅读
- android - 错误状态:DocumentSnapshotPlatform 中不存在字段。(StreamBuilder 有问题)
- kubernetes - 防止容器内的OOM
- javascript - 我的网站在 chrome 上的欺骗性网站提前警告
- python - 如何在不按 kivymd 按钮的情况下自动从 MDTextfield 获取数据
- r - Legend position based on coordinates in ggplot2
- python - excel文件中的每两列被分成多个csv文件
- python-3.x - 发生异常:IndexError list index out of range, line 5, in module file_path - sys.argv[1] Python & PyPDF2
- gitlab - Packer 在 Gitlab-runner 上执行时失败
- javascript - 世博会背景获取未运行
- imagemagick - Imagemagick - 逆