能否让Eloquent查询构建器返回StdClass而非模型,且避免模型水合?
如何让Eloquent查询构建器返回StdClass而非Model
当然可以!如果你想保留Eloquent查询构建器的便捷语法,但又想跳过模型水合过程、返回和DB::table()一样的StdClass集合来提升性能,Laravel提供了几种简单的方式:
方法1:使用toBase()获取底层查询构建器
这是最直观的方式,toBase()方法会返回Eloquent查询构建器对应的底层Illuminate\Database\Query\Builder实例,也就是和DB::table()使用的同一个查询构建器。调用它的get()方法就会返回StdClass对象的集合:
$users = User::where('age', '>', 34)->toBase()->get();
方法2:使用getQuery()方法
和toBase()效果一致,getQuery()同样会返回底层的查询构建器实例:
$users = User::where('age', '>', 34)->getQuery()->get();
方法3:大数据量场景用cursor()
如果要处理大量数据,不想一次性加载所有结果到内存,可以用底层查询器的cursor()方法,返回一个StdClass的生成器(Generator),内存占用更友好:
$users = User::where('age', '>', 34)->toBase()->cursor(); // 遍历结果 foreach ($users as $user) { echo $user->name; // 直接访问StdClass属性 }
注意事项
- 这些方式会跳过Eloquent模型的水合过程,所以你没法使用模型的方法、访问器、关联预加载(
with())、观察者事件等特性,只能拿到数据库表中的原始字段值。 - 性能提升确实明显,尤其是数据量较大时,因为模型实例化、属性填充等步骤都被省略了。
内容的提问来源于stack exchange,提问作者AndrewMcLagan
相关产品推荐
相关产品推荐

