如何将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
相关产品推荐
相关产品推荐

