【问题标题】:Laravel - convert array into eloquent collectionLaravel - 将数组转换为雄辩的集合
【发布时间】:2019-05-31 06:08:48
【问题描述】:

我需要使用来自 API 的数据。

我创建一个函数:

    public function getItems()
{
    $client = new \GuzzleHttp\Client();
    $res = $client->get('https://app.example.com/api/getItems');

$vouchers = json_decode($res->getBody(), true);

dd($vouchers);

return view('api', compact('vouchers'));


}

dd($vouchers) 回复我:

现在,当我尝试将 $vouchers 数组与刀片引擎一起使用时:

<body>
              @foreach ($vouchers as $v)
                <p>{{$v->name}}</p>
              @endforeach
          </body>

我收到错误:

"Trying to get property 'name' of non-object (View: .... etc...

如何将数组转换为雄辩的集合。 我用的是最新的 Laravel 5.7 版本

【问题讨论】:

  • 你能dd($vouchers['vouchers']); 并把结果发回吗?
  • 问题标题可能会误导某些人和我解释问题标题的方式,答案应该是new \Illuminate\Database\Eloquent\Collection(&lt;array of models&gt;);

标签: php arrays laravel collections eloquent


【解决方案1】:

其实你的$vouchers是一个数组数组,

因此您可能希望将子数组转换为对象:

您可以简单地使用:

foreach ($vouchers['vouchers'] as $key => $value) {
    $vouchers['vouchers'][$key] = (object) $value;
}

.. 或使用集合:

$vouchers = collect($vouchers['vouchers'])->map(function ($voucher) {
    return (object) $voucher;
});

Laravel collections documentation

【讨论】:

    【解决方案2】:

    这是因为数组有索引。 你可以这样做:

    @for ($i = 0; $i < count($vouchers); $i++)
        <p>{{$vouchers[$i]->name}}</p>
    @endfor
    

    更新

    如果他们每个人都包含另一个数组,你可以试试这个:

    @for ($i = 0; $i < count($vouchers); $i++)
        <p>{{$vouchers[$i][0]->name}}</p>
    @endfor
    

    【讨论】:

      【解决方案3】:

      要将数组转换为Illuminate\Database\Eloquent\Collection,您可以将hydrate() 方法与目标Eloquent 模型一起使用,例如:

      $eloquentCollection = TheEloquentModel::hydrate($arr);
      

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 2021-09-07
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        • 2015-08-15
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多