拉拉维尔(Laravel)对象转换为数组

6

我尝试使用数组而不是集合,就像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 [...]) )

我知道论坛上有更多相关信息,但它们都已经过时了。
谢谢。
3个回答

5

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();

有没有一种方法可以为整个网站只做一次,因为我只想使用那个。 - user5713060
请查看我的编辑,了解如何在您的应用程序中对任何集合使用此函数。@KarylLamoureux - Jeff
谢谢,只是一个小问题,现在它是Array ( [0] => Array ( [uid] => 1 [...]) )。有没有办法删除第一个数组?只保留宏中的Array ( [uid] => 1 [...])?@Jeff - user5713060
1
当你使用 take(1)->get() 时,它仍然返回一个集合。如果你想要单个对象作为响应,你需要使用 first(),请参考 @Alexey 的答案。 - Jeff
我已经用 first() 替换了 take(1)->get(),结果提示:_stdClass::toArrays() 方法未定义_。 - user5713060
显示剩余2条评论

0

你可以使用 Laravel Collection 的 map 方法 将每个对象转换为数组。


0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接