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

不想转Laravel查询构造器,如何将原生SQL结果映射到模型?

当然可以!完全理解你不想把复杂原生SQL硬转成Query Builder的心情——那些嵌套exists子句、复杂排序的写法转成QB后确实会变得冗长又难读,完全没必要勉强自己。这里有几个简单的办法,能直接把你的原生SQL查询结果映射到User模型:

方法1:直接用hydrate()把原生查询结果转成模型集合

这是最直接的方案,尤其适合你的完整原生查询场景:

// 执行原生SQL,得到关联数组结果
$rawResults = DB::select('SELECT users.* FROM users WHERE exists (super_long_raw_query) AND many_more_raw_where_clauses ORDER BY something_complex');

// 把数组结果转换成User模型实例的集合
$users = User::hydrate($rawResults);

这样得到的$users是标准的Eloquent集合,每个元素都是完整的User模型——你可以正常调用模型的访问器、关联方法,甚至后续链式调用集合的操作(比如filter()、sortBy())都没问题。

方法2:用Eloquent的原生子句方法混合编写

如果你的查询只是部分条件(比如WHERE、ORDER BY)特别复杂,不想全部写成原生,也可以用whereRaw()、orderByRaw()这类方法和Eloquent语法结合,既保留原生SQL的可读性,又能直接得到模型:

$users = User::query()
    ->whereRaw('exists (super_long_raw_query) AND many_more_raw_where_clauses')
    ->orderByRaw('something_complex')
    ->get();

这种方式的好处是,你还能在后续轻松添加QB风格的条件(比如->where('active', true)),灵活性更高。

额外:如果需要分页怎么办?

如果你的查询需要分页,可以先让DB类处理分页逻辑,再把结果转成模型:

// 执行带分页的原生查询
$paginatedRaw = DB::paginate(
    perPage: 15,
    columns: ['*'],
    pageName: 'page',
    page: request('page', 1),
    query: 'SELECT users.* FROM users WHERE exists (super_long_raw_query) AND many_more_raw_where_clauses ORDER BY something_complex'
);

// 把分页结果里的数组转成User模型
$users = User::hydrate($paginatedRaw->items());

// 替换分页实例里的集合
$paginatedRaw->setCollection($users);

现在$paginatedRaw就是包含User模型实例的分页对象,能直接在视图里用links()渲染分页导航。

内容的提问来源于stack exchange,提问作者rap-2-h

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:31