Laravel 5.1 DB:选择toArray()

Yev*_*yev 16 laravel eloquent laravel-5 laravel-5.1

我有一个大的SQL语句,我正在执行如下:

$result = DB::select($sql);
Run Code Online (Sandbox Code Playgroud)

例如

$result = DB::select('select * from users');
Run Code Online (Sandbox Code Playgroud)

我希望结果是一个数组 - 但此刻它返回一个像这样的结构,一个带有Objects的数组......

Array
(
    0 => stdClass::__set_state(array(
        'id' => 1,
        'first_name' => 'Pavel',
        'created_at' => '2015-02-23 05:46:33',
    )),
    1 => stdClass::__set_state(array(
        'id' => 2,
        'first_name' => 'Eugene',
        'created_at' => '2016-02-23 05:46:34',
    )),
...etc...
Run Code Online (Sandbox Code Playgroud)

)

小智 28

看起来您需要将stdClass对象转换为数组,以便您可以拥有所需的结构

$result = array_map(function ($value) {
    return (array)$value;
}, $result);
Run Code Online (Sandbox Code Playgroud)

  • Eloquent会这样做,但你使用的是[查询生成器](https://laravel.com/docs/5.2/queries),而不是Eloquent (4认同)

Mar*_*łek 17

考虑性能的最佳解决方案是改变从数据库中获取数据的方法:

// get original model
$fetchMode = DB::getFetchMode();
// set mode to custom
DB::setFetchMode(\PDO::FETCH_ASSOC);
// get data
$result = DB::select($sql);
// restore mode the original
DB::setFetchMode($fetchMode);
Run Code Online (Sandbox Code Playgroud)

显然,如果您想将所有数据作为数组获取,那么config/database.php从以下位置进行更改就足够了:

'fetch'       => PDO::FETCH_CLASS,
Run Code Online (Sandbox Code Playgroud)

成

'fetch'       => PDO::FETCH_ASSOC,
Run Code Online (Sandbox Code Playgroud)

然后只运行:

$result = DB::select($sql);
Run Code Online (Sandbox Code Playgroud)

将返回多维数组而不是对象数组

  • 我在Laravel 5.4中遇到了这个错误:`调用未定义的方法Illuminate\Database\MySqlConnection :: getFetchMode()`. (3认同)

Yev*_*yev 11

这是另一种值得一提的方法:

$resultArray = json_decode(json_encode($result), true);
Run Code Online (Sandbox Code Playgroud)


Ale*_*nin 8

toArray()method将collection转换为数组.模型也转换为数组:

该toArray方法将集合转换为普通的PHP数组.如果集合的值是Eloquent模型,则模型也将转换为数组

所以,我猜你做错了什么.如果您需要更多帮助,请使用所有相关代码更新您的问题.

此外,只有Eloquent集合(模型)才有toArray()方法.

要使用此方法,请使用Eloquent:

$result = \App\User::all()->toArray();
Run Code Online (Sandbox Code Playgroud)