在Laravel 3中,如何将原始查询的结果集检索为数组而不是对象?

32

默认情况下,Laravel的原始查询方法将结果作为stdClass对象数组返回:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [username] => admin
            [password] => admin123
            [email] => admin@admin.com
            [created_at] => 2012-12-06 18:57:19
            [updated_at] => 2012-12-06 00:00:00
        )

    [1] => stdClass Object
        (
            [id] => 2
            [username] => userna
            [password] => user
            [email] => user@gmail.com
            [created_at] => 2012-12-06 00:00:00
            [updated_at] => 2012-12-05 00:00:00
        )
)

问题是如何让Laravel返回一个二维数组:

   Array
    (
        [0] => Array
            (
                [id] => 1
                [username] => admin
                [password] => admin123
                [email] => admin@admin.com
                [created_at] => 2012-12-06 18:57:19
                [updated_at] => 2012-12-06 00:00:00
            )

        [1] => Array
            (
                [id] => 2
                [username] => userna
                [password] => user
                [email] => user@gmail.com
                [created_at] => 2012-12-06 00:00:00
                [updated_at] => 2012-12-05 00:00:00
            )
    )

请提供导致此结果的代码。 - Niklas Modess
6
我很理解这句话的意思,我正在尝试学习Laravel并遇到了障碍。这是一个真实且合理的问题——想知道那些说它不是问题的人是否具有使用这个框架的经验? - NightMICU
8
为什么这个被关闭了?人们需要放下自我。 - dardub
1
如果有更好的答案需要添加,请重新打开。 - Moak
3个回答

36

通过更改 application/config/database.php,您还可以始终将所有结果作为数组获取。

'fetch' => PDO::FETCH_CLASS,

在第31行

'fetch' => PDO::FETCH_ASSOC,

但是如何在代码中动态地完成呢?我只想为一个数据库连接获取数组。我有这个连接 $sqlserv_connection = DB::connection($this->getSqlServerConnectionName()); 我想要类似于 $sqlserv_connection->fetch(PDO::FETCH_ASSOC) 的东西。我知道这并不存在,但我该如何实现呢? - Mahmoud Zalt
1
只是想指出 'fetch' 设置不是连接特定的,而是在 database.php 的顶部。不知怎么地,我推断它是连接特定的,并将其添加到每个连接中,但没有效果。希望这能帮助其他误入歧途的人。 - Martin Woolstenhulme
2
不确定是4还是3,但在Laravel 5中,您可以进行查询: $query = DB :: table('companies')-> where('status','active'); 然后在运行之前设置它 DB :: connection()-> setFetchMode(\ PDO :: FETCH_ASSOC); 然后获取结果 $result = $query->get()-> toArray(); 并且$result将是一个数组的数组。 - Phillip Harrington
2
@PhillipHarrington 这似乎已经被删除了 :( 错误: 调用未定义的方法 Illuminate\Database\MySqlConnection::setFetchMode() - Jeff Puckett
@JeffPuckett 看起来根据这个问题,它在5.4中被删除了:https://github.com/laravel/framework/issues/17728 - Phillip Harrington

22

Laravel 3的原始答案

Eloquent有一个名为to_array()的方法

来自文档:

to_array()方法将自动获取您的模型上的所有属性以及任何已加载的关系。

$user = User::find($id);

return Response::json($user->to_array());

或者

return Response::eloquent($user);

如果您正在使用Fluent,您可以像Sinan建议的那样更改全局配置以返回关联数组而不是对象。
另外,您可以将对象转换为JSON,然后再将其转换为数组,虽然在大多数情况下全局选项更可取。您可以在通常喜欢对象但在某些边缘情况下需要数组的项目中使用以下方法。这种方法在Eloquent中效果不佳,在那种情况下请使用上面的方法。
$users = DB::table('users')->where('name', '=', 'david')->get();

return array_map(function($val)
{
    return json_decode(json_encode($val), true)
}, $users);

另一个选择是暂时更改运行时配置。
Config::set('database.fetch', PDO::FETCH_ASSOC);

Laravel ~4专用

在Laravel 4及其以后版本中,所有方法名称符合PSR-2标准。

$user = User::findOrFail($id);

return Response::json($user->toArray());

// In Laravel 5 onward the functions are preferred to facades.
return response()->json($user->toArray());

1
未处理的异常 信息: 调用未定义的方法stdClass::to_array() - Ramesh
Fluent有没有to_array()的等效方法? - Nyxynyx
1
他的问题是:“$arrOfObjects = DB::connection()->query('SELECT * from table LIMIT 0, 3');” 这会返回一个对象数组。Sinan已经回答了这个问题。stdClass是根据laravel/database/connection.php文件中的配置确定的。 - Dustin Graham
在 Laravel 4 中,找不到此函数。 - vuhung3990
1
这是因为这个答案是针对 Laravel 3 的。Laravel 4 是 toArray() - David Barker
显示剩余2条评论

10

我不知道laravel是否有内置函数可以返回数组结果,但如果没有,您可以使用以下代码片段:

其中$data是您返回的对象数组。

$data = json_decode(json_encode((array) $data), true);

@ramesh 没问题,这里有另一个答案可能更有用,因为它使用了 Laravel 方法,请参考 DavidBarker 的回答。 - Dale
这是一种非常糟糕的做法,因为你既对其进行编码又对其进行解码。这将导致完全相同的结果:$data =(array)$data; - Niklas Modess
@nerdklers 不会的,因为 $data 已经是一个数组了,它不会将内部对象更改为数组,我在发布这个混乱的解决方法之前自己尝试过那种方法 :) - Dale

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