我正在尝试使用方法
toArray()
将查询转换为数组,但它不适用于查询生成器。转换它有什么想法吗?
例子
DB::table('user')->where('name',=,'Jhon')->get()->toArray();
如果您更喜欢使用 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);
toArray 是 Eloquent 的一个模型方法,所以你需要一个 Eloquent 模型,试试这个:
User::where('name', '=', 'Jhon')->get()->toArray();
请注意,从 Laravel 5.4 开始,显然不再支持下面显示的选项(感谢@Alex)。
在 Laravel 5.3 及以下版本中,有一种方法可以为选择查询设置获取模式。
在这种情况下,这样做可能更有效:
DB::connection()->setFetchMode(PDO::FETCH_ASSOC);
$result = DB::table('user')->where('name',=,'Jhon')->get();
这样,您就不会浪费时间创建对象然后将它们转换回数组。
还有另一个解决方案
$objectData = DB::table('user')
->select('column1', 'column2')
->where('name', '=', 'Jhon')
->get();
$arrayData = array_map(function($item) {
return (array)$item;
}, $objectData->toArray());
如果您只需要实体中的几列,这很好。
在 Laravel 5.6 中测试
最快最简单的方法就是使用json_decode(不需要使用json_encode),例子:
$records = DB::table('user')->where('name',=,'Jhon')->get();
echo json_decode($records,true);
我目前在 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 对此添加适当的支持是有意义的,但现在我只是制作了我自己的助手类来设置和恢复我需要它的查询。
最简单的方法是使用 laravel toArray 函数本身:
$result = array_map(function ($value) {
return $value instanceof Arrayable ? $value->toArray() : $value;
}, $result);
您可以使用查询生成器执行此操作。只需使用 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 上使用它。
试试这个
DB::table('user')->where('name','Jhon')->get();
只需删除“=”符号。 . . .因为你试图只排列名称 'jhon' 。 . . . . . . .希望对你有帮助。 .