Laravel 对象到数组

Posted

技术标签:

【中文标题】Laravel 对象到数组【英文标题】:Laravel Object to Array 【发布时间】:2018-06-07 13:10:50 【问题描述】:

我尝试了一段时间使用数组而不是集合,就像 Laravel 所做的那样。

我尝试了这个方法,没有成功:

Event::listen(StatementPrepared::class, function ($event) 
    $event->statement->setFetchMode(...);
);

正如https://laravel.com/docs/5.4/upgrade#upgrade-5.4.0 中所述,但它不起作用...

我也尝试过这样做:

DB::table('users')->where([...])->take(1)->get()->toArray();

但它正在做:

Array ( [0] => stdClass Object ( [uid] => 1 [...]) )

我知道论坛上有更多关于它的内容,但它们都已经过时了。

谢谢

【问题讨论】:

【参考方案1】:

toArray 正在将对象集合更改为对象数组,就像它应该做的那样。如果希望集合内的对象也是数组,则需要先对每个对象进行转换:

$collection = DB::table('users')->where([...])->take(1)->get();

$array = $collection->map(function($obj)
  return (array) $obj;
)->toArray();

要在您的整个应用程序中使用此功能,您可以在您的服务提供商之一的boot 方法中添加一个集合宏:

Collection::macro('toArrays', function () 
  return $this->map(function ($value) 
    return (array) $value;
  )->toArray();
);

这在服务提供者文件的顶部:

use Illuminate\Support\Collection;

然后,您可以在任何获得一组数据库结果的地方调用toArrays

DB::table('users')->where([...])->get()->toArrays();

【讨论】:

有没有办法为整个网站只做一次,因为,我只想使用它。 查看我的编辑,了解在您的应用程序中的任何集合上使用此功能的简单方法@KarylLamoureux 谢谢,只是小事,现在是Array ( [0] => Array ( [uid] => 1 [...]) )。这是删除第一个数组的方法吗?只在宏中有Array ( [uid] => 1 [...]) 吗? @杰夫 当您使用take(1)->get() 时,它仍会返回一个集合。如果您想要一个对象作为响应,则需要使用first(),请参阅@Alexey 的答案。 我已将 take(1)->get() 替换为 first() 并表示:调用未定义的方法 stdClass::toArrays()【参考方案2】:

由于您只得到一个对象,请使用first() 方法:

$object = DB::table('users')->where([...])->first();
$array = (array)$object;

【讨论】:

好答案,我没有注意到他只取了 1。您可能需要对它进行类型转换而不是调用 toArray(),因为它只是一个基本对象 @Jeff 是的,我刚刚对其进行了测试并在您发表评论的同时更新了答案。 OP 需要使用(array) 强制转换。谢谢。【参考方案3】:

你可以使用 Laravel Collection 的 map method 将每个对象变成一个数组。

【讨论】:

以上是关于Laravel 对象到数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vform 将对象数组传递给 laravel

Laravel 5:in_array() 期望参数 2 是数组,给定对象

Laravel - 使用对象数组更新并将记录保存到数据库

Laravel - 从 JSON 数组创建对象以将其保存在 SQL 数据库中

Laravel - 根据键值删除数组内的对象 - array_filter

Laravel 集合 - 返回对象数组