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

Posted

技术标签:

【中文标题】Laravel:将 Eloquent 集合转换为数组而不转换元素【英文标题】:Laravel: Convert Eloquent collection to Array without converting elements 【发布时间】:2019-04-12 04:50:54 【问题描述】:

有没有一种(简单的)方法可以将 Eloquent 集合转换为实际数组,而无需转换元素本身?

当我尝试将集合传递到像array_rand($collection) 这样的php 方法时遇到了麻烦。这给了我错误:array_rand() expects parameter 1 to be array, object given

我通过使用 $collection->shuffle()->first(); 解决了这个问题,它工作正常,当然我可以遍历集合并将所有内容推送到一个数组中,但出于好奇,我想知道我是否忽略了某些东西。

更新/结论

Illuminate\Support\CollectionIlluminate\Database\Eloquent\Collection 上的 all 方法似乎有所不同。 Eloquent 集合上的 all 返回一个支持集合,支持集合返回一个数组。

所以要获得一组 Eloquent 模型,您需要使用 SomeModel::all()->all();

【问题讨论】:

【参考方案1】:

我的第一个想法是$collection->toArray(),但这也将 Eloquent 模型转换为数组。但是docs 说$collection->all() 应该避免这种情况。

toArray 还将集合的所有嵌套对象转换为数组。如果要获取原始底层数组,请改用all 方法。

【讨论】:

【参考方案2】:

您可以使用all 收集助手:

all 方法返回由 收藏:

collect([1, 2, 3])->all();

// [1, 2, 3]

【讨论】:

啊,这似乎确实适用于“Illuminate\Support\Collection”。由于我是从 Eloquent 模型 ('Illuminate\Database\Eloquent\Collection') 中获取集合的,因此我的印象是我使用的所有 SomeModel::all() 已经相同。但现在我看到我需要对结果再做一次全调用:SomeModel::all()->all()

以上是关于Laravel:将 Eloquent 集合转换为数组而不转换元素的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 Eloquent - 将计算值作为列添加到集合

Laravel 将 SQL 转换为 Eloquent:按 sum() 排序

将 MariaDB 语句转换为 Laravel4 Eloquent-Query

如何通过索引将项目添加到 Laravel Eloquent 集合中?

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

需要将查询转换为 Eloquent Model laravel