我有json列,我将订单数据保存在其中,下面的代码是该数据的样本:
[{"id":27,"name":"new product","price":7246,"quantity":"1","attributes":[],"conditions":[]}]
上面的代码,如果我在我的编辑页面中有这样的循环,我就可以获得订单信息:
@foreach($order->product_data as $data)
{{ $data['quantity'] }}
@endforeach
直到这里一切都很好,但问题来的是我的订单有"attributes":[],
属性然后我得到这个错误:
为foreach()提供的参数无效
我在json列中的数据如下:
"[{\"id\":29,\"name\":\"effewf\",\"price\":24524,\"quantity\":\"1\",\"attributes\":[{\"attr\":{\"label\":\"Red\",\"price\":\"5000.00\"}},{\"attr\":{\"label\":\"22\\\"\",\"price\":\"900000.00\"}}],\"conditions\":[]}]"
如您所见,此订单有2个属性。 (可以或多或少)。
这就是我在订单模型中获取这些数据的方式:
protected $casts = [
'product_data' => 'array',
];
知道为什么我会收到错误以及如何获取属性数据,无论我的订单是否具有属性?
如果我打开没有属性的订单的编辑页面,dd
结果将如下:
array:6 [▼
"id" => 27
"name" => "new product"
"price" => 7246
"quantity" => "1"
"attributes" => []
"conditions" => []
]
如果按顺序加载相同的属性,则会得到上面的错误。
答案 0 :(得分:3)
您应该只允许打印数据(如果存在并且具有我们期望的格式),请为您的代码添加必要的条件,如下所示,这可能会导致错误
假设您在帖子中拥有的数组是您需要打印的数据。
@if($order->product_data) // check product_data value or not , also add key exists if needed
@if(is_array($order->product_data)) // check for product_data is array or not
@foreach($order->product_data as $data)
{{ $data['quantity'] // if array }}
{{ $data->quantity // if object }}
@if($data->attributes)
@foreach($data->attributes as $attribute) // loop through attributes
{{ $attribute->nameOfTheProperty // if object }}
@endforeach
@endif
@endforeach
@endif
@endif
但如果可能的话,最好在控制器中处理数据
<强>更新强>:
您需要将数据转换为数组,因为如果没有值,则属性属性将为空数组,否则将为stdObject。
所以你的代码应该是:( $order->product_data
如果没有则应该是一个数组,然后将其转换为数组)
@if($order->product_data)
@if(is_array($order->product_data)) // assuming array
@foreach($order->product_data as $data)
{{ $data['quantity'] // if array }}
@if(count($data['attributes']) > 0) // **checked for blank array**
@foreach($data->attributes as $attribute) // loop through attributes
{{ $attribute['attr']['label'] }}
{{ $attribute['attr']['price'] }}
@endforeach
@endif
@endforeach
@endif
@endif
答案 1 :(得分:1)
尝试使用您的示例数据,并且执行时没有任何错误。
$json = "[{\"id\":29,\"name\":\"effewf\",\"price\":24524,\"quantity\":\"1\",\"attributes\":[{\"attr\":{\"label\":\"Red\",\"price\":\"5000.00\"}},{\"attr\":{\"label\":\"22\\\"\",\"price\":\"900000.00\"}}],\"conditions\":[]}]";
$jsonAsArray = json_decode($json, true);
foreach ($jsonAsArray as $data) {
echo $data['quantity'] . "\n";
if (! empty($data['attributes']) ) {
if (is_array($data['attributes'])) {
foreach ($data['attributes'] as $attribute) {
echo $attribute['attr']['label'] . ' ' . $attribute['attr']['price'] . "\n";
}
}
}
}
输出:
1
Red 5000.00
22" 900000.00
在您的情况下,product_data
不会被转换为数组。
您可以尝试在订单模型中定义Accessor,并删除product_data
public function getProductDataAttribute($value)
{
return json_decode($value, TRUE);
}
或手动解码循环中的json
@foreach (json_decode($order->product_data, TRUE) as $data)
{{ $data['quantity'] }}
@if (! empty($data['attributes']))
@foreach ($data['attributes'] as $attribute)
{{ $attribute['attr']['label'] }} {{ $attribute['attr']['price'] }}
@endforeach
@endif
@endforeach
答案 2 :(得分:0)
这就是我的工作方式(类别是数据库中的json列):
<div class="category">
<ul class="list-group">
@foreach ( json_decode( $code->category ) as $category)
<li class="list-group-item d-flex justify-content-between align-items-center">
<span class="badge badge-secondary badge-pill">{{$category}}</span>
</li>
@endforeach
</ul>
</div>
您只需要json_decode您的json列即可获取数组并对其进行迭代。就是这样,欢呼。