You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:02:47