You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Laravel关联查询的商品属性转为指定JSON格式?

问题:Laravel中如何将关联属性转换为指定的JSON格式?

我现在需要把商品的属性数据转换成特定格式供其他系统使用,现有Laravel代码如下:

$product = Product::with('product_attribute_values', 'product_attribute_values.product_attribute_key')->find(2);
$product_decoded = json_decode($product, true);

我想要提取商品属性值并转换为如下指定格式:

{
 "Material":"Plastic",
 "Printing Method":"Pad",
 "Ink Colour":"Black",
 "Barrel Colour":"Silver",
 "Grip Colour":"Black"
}

我尝试了以下代码:

$final_array = array();
foreach($product_decoded['product_attribute_values'] as $pav) {
 $array = [ $pav['product_attribute_key']['name'] => $pav['name'] ];
 array_push($final_array, $array);
}
return json_encode($final_array);

但得到的结果是一个包含多个对象的数组,不是我想要的单个对象:

[ {"Material":"Plastic"}, {"Printing Method":"Pad"}, {"Ink Colour":"Black"}, {"Barrel Colour":"Silver"}, {"Grip Colour":"Black"} ]

请问如何修改代码以实现目标格式?


解决方案

你现在的问题出在循环里每次都创建了一个独立的小关联数组,然后把这个小数组push到$final_array中,最后自然得到的是一个包含多个对象的数组。我们只需要直接把键值对赋值给$final_array本身,就能生成单个对象结构了。

修改后的代码如下:

$final_array = array();
foreach($product_decoded['product_attribute_values'] as $pav) {
    // 直接将属性键作为$final_array的键,属性值作为对应的值
    $final_array[$pav['product_attribute_key']['name']] = $pav['name'];
}
return json_encode($final_array);

另外,其实你还可以简化流程——不用先把模型实例转成JSON再解码,直接操作模型对象会更简洁优雅:

$product = Product::with('product_attribute_values.product_attribute_key')->find(2);
$final_array = [];

foreach($product->product_attribute_values as $pav) {
    $final_array[$pav->product_attribute_key->name] = $pav->name;
}

return json_encode($final_array);

这样处理后,最终输出的JSON就是你想要的单个对象格式,每个属性键对应一个属性值。

内容的提问来源于stack exchange,提问作者Aontaigh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:48:09