从laravel 5.5中的json列获取信息

时间:2018-02-05 04:31:14

标签: php json laravel

我有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" => []
]

如果按顺序加载相同的属性,则会得到上面的错误。

3 个答案:

答案 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列即可获取数组并对其进行迭代。就是这样,欢呼。