如何从原始查询中检索结果集作为数组而不是 Laravel 3 中的对象
Posted
技术标签:
【中文标题】如何从原始查询中检索结果集作为数组而不是 Laravel 3 中的对象【英文标题】:How to retrieve a result set from a raw query as an array instead of an object in Laravel 3 【发布时间】:2012-11-24 15:13:43 【问题描述】:默认情况下,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
)
)
【问题讨论】:
请提供导致此结果的代码 这对我来说非常有意义,我正在尝试学习 Laravel 并遇到了这个障碍。这是一个真实而有效的问题 - 想知道说它的人是否对这个框架没有任何经验? 为什么要关门?人们需要克服自己。 有更好的答案要补充,请重新打开 【参考方案1】:我不知道 laravel 是否有内置函数将结果作为数组返回,但如果没有,你可以使用这个 sn-p:
其中$data
是您返回的对象数组
$data = json_decode(json_encode((array) $data), true);
【讨论】:
@ramesh 没问题,这里还有另一个答案可能更有用,因为它使用 laravel 方法,请参阅 DavidBarker 答案 这是一个非常糟糕的做法,因为您既要对其进行编码,又要对其进行解码。这将产生完全相同的结果:$data = (array) $data;
@nerdklers 它不会因为$data
已经是一个数组,它不会将内部对象更改为数组,我在发布这个不守规矩的解决方法之前自己尝试过这种方法:)【参考方案2】:
Laravel 3 的原始答案
Eloquent 有一个方法to_array()
来自文档:
to_array 方法会自动抓取所有的属性 你的模型,以及任何加载的关系。
$user = User::find($id);
return Response::json($user->to_array());
或
return Response::eloquent($user);
如果您使用的是fluent,您可以按照思南的建议进行操作,并更改全局配置以返回关联数组而不是对象。
或者,您可以将对象与 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());
【讨论】:
未处理的异常消息:调用未定义的方法 stdClass::to_array() 这是针对 Laravel 3.x 的,to_array()
是 Eloquent 的一个方法。也在文档laravel.com/docs/database/eloquent 中。你能分享一些你的代码让我们看看问题出在哪里吗?
Fluent 是否有 to_array()
的等价物?
他的问题是:$arrOfObjects = DB::connection()->query('SELECT * from `table` LIMIT 0, 3');
确实返回一个对象数组。司南回答。 stdClass 根据配置在 laravel/database/connection.php 文件中确定。
这是因为这个答案适用于 laravel 3。Laravel 4 是 toArray()
【参考方案3】:
您也可以通过更改将所有结果始终作为数组获得
应用程序/config/database.php
'fetch' => PDO::FETCH_CLASS,
在第 31 行到
'fetch' => PDO::FETCH_ASSOC,
【讨论】:
但如何在代码中动态执行呢?我只想为一个数据库连接获取数组。我有这个连接$sqlserv_connection = DB::connection($this->getSqlServerConnectionName());
我想要类似$sqlserv_connection->fetch(PDO::FETCH_ASSOC)
的东西我知道这不存在但我怎样才能做到这一点?
只想指出“获取”设置不是特定于连接的,而是位于 database.php 的顶部。不知何故,我推断它是特定于连接的,并将其添加到每个连接中,但没有任何效果。希望这可以帮助其他一些被误导的灵魂。
不确定是 4 还是 3,但是在 Laravel 5 中,您可以进行查询:$query = DB::table('companies')->where('status', 'active');
然后在运行之前设置它DB::connection()->setFetchMode(\PDO::FETCH_ASSOC);
然后得到结果$result = $query->get()->toArray();
和$result
将是一个数组数组
@PhillipHarrington 这似乎已被删除:( Error: Call to undefined method Illuminate\Database\mysqlConnection::setFetchMode()
@JeffPuckett 看起来它在每个问题的 5.4 中都被删除了:github.com/laravel/framework/issues/17728以上是关于如何从原始查询中检索结果集作为数组而不是 Laravel 3 中的对象的主要内容,如果未能解决你的问题,请参考以下文章
如何从firebase数据库中检索数据作为字符串而不是字典并将其添加到数组中?
未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组