Laravel - 将数组转换为雄辩的集合

Posted

技术标签:

【中文标题】Laravel - 将数组转换为雄辩的集合【英文标题】:Laravel - convert array into eloquent collection 【发布时间】: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;); 【参考方案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);

【讨论】:

以上是关于Laravel - 将数组转换为雄辩的集合的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩不更新 JSON 列:数组到字符串的转换

将原始查询转换为雄辩的 laravel

Laravel 雄辩的 all() 方法给出错误“数组到字符串的转换”[关闭]

将 Laravel 集合/数组转换为 Javascript 数组

Laravel:将 Eloquent 集合转换为数组而不转换元素

Laravel 集合将数组转换为对象