数据库查询生成器 toArray() laravel 4

问题描述 投票:0回答:9

我正在尝试使用方法

toArray()
将查询转换为数组,但它不适用于查询生成器。转换它有什么想法吗?

例子

DB::table('user')->where('name',=,'Jhon')->get()->toArray();
laravel-4 query-builder
9个回答
74
投票

如果您更喜欢使用 Query Builder 而不是 Eloquent,这里是解决方案

$result = DB::table('user')->where('name',=,'Jhon')->get();

第一个解决方案

$array = (array) $result;

第二种解决方案

$array = get_object_vars($result);

第三种解决方案

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

66
投票

toArray 是 Eloquent 的一个模型方法,所以你需要一个 Eloquent 模型,试试这个:

 User::where('name', '=', 'Jhon')->get()->toArray();

http://laravel.com/docs/eloquent#collections


14
投票

请注意,从 Laravel 5.4 开始,显然不再支持下面显示的选项(感谢@Alex)。

在 Laravel 5.3 及以下版本中,有一种方法可以为选择查询设置获取模式

在这种情况下,这样做可能更有效:

DB::connection()->setFetchMode(PDO::FETCH_ASSOC);
$result = DB::table('user')->where('name',=,'Jhon')->get();

这样,您就不会浪费时间创建对象然后将它们转换回数组。


9
投票

还有另一个解决方案

$objectData = DB::table('user')
    ->select('column1', 'column2')
    ->where('name', '=', 'Jhon')
    ->get();
$arrayData = array_map(function($item) {
    return (array)$item; 
}, $objectData->toArray());

如果您只需要实体中的几列,这很好。


1
投票

在 Laravel 5.6 中测试

最快最简单的方法就是使用json_decode(不需要使用json_encode),例子:

$records = DB::table('user')->where('name',=,'Jhon')->get();

echo json_decode($records,true);

0
投票

我目前在 L8 上,这是我能找到的唯一方法,可以让这个用于 single 查询。您必须将事件回调全局设置为

FETCH_ASSOC
,然后在查询运行后立即将其设置回
FETCH_OBJ
(Laravel 默认值)。

use Illuminate\Support\Facades\Event;
use Illuminate\Database\Events\StatementPrepared;

Event::listen(StatementPrepared::class, function ($event) {
        $event->statement->setFetchMode(\PDO::FETCH_ASSOC);
    });

$collectionOfArrays = \DB::table('table1')->where(...)->get();

Event::listen(StatementPrepared::class, function ($event) {
        $event->statement->setFetchMode(\PDO::FETCH_OBJ);
    });

如果你想要

FETCH_ASSOC
行为贯穿始终,那么你可以按照官方升级指南将第一个监听器放在
AppServiceProvider
中。

对于我的用例,我正在处理数百万条记录,然后通过

insert()
将它们作为数组分块插入到另一个表中。作为数组获取并作为数组更新更有意义,而不是沿途更改可迭代类型(性能是这里的关键)。

我不知道这个 hack 有任何性能警告,因为到目前为止它对我很好。 Laravel 对此添加适当的支持是有意义的,但现在我只是制作了我自己的助手类来设置和恢复我需要它的查询。


-1
投票

最简单的方法是使用 laravel toArray 函数本身:

    $result = array_map(function ($value) {
        return $value instanceof Arrayable ? $value->toArray() : $value;
    }, $result);

-2
投票

您可以使用查询生成器执行此操作。只需使用 SELECT 而不是 TABLE 和 GET。

DB::select('select * from user where name = ?',['Jhon']);

注意事项: 1. 允许有多个问号。 2.第二个参数必须是数组,即使只有一个参数。 3. Laravel 会自动清理参数,所以你不必这样做。

更多信息在这里:http://laravel.com/docs/5.0/database#running-queries

Hmmmmmm,事实证明,当我不使用 where 子句时,它仍然为我返回一个标准类。我发现这有帮助:

foreach($results as $result)
{
print_r(get_object_vars($result));
}

但是,get_object_vars 不是递归的,所以不要在 $results 上使用它。


-3
投票

试试这个

DB::table('user')->where('name','Jhon')->get();

只需删除“=”符号。 . . .因为你试图只排列名称 'jhon' 。 . . . . . . .希望对你有帮助。 .

© www.soinside.com 2019 - 2024. All rights reserved.