求嵌套SQL查询对应的Laravel模型实现方式
将嵌套SQL转换为Laravel中TableA模型的等效实现
原SQL语句
SELECT * FROM ( SELECT * FROM tbl ORDER BY updated_at LIMIT 20 ) ORDER BY random() LIMIT 5;
实现代码与说明
已知TableA模型对应tbl表,我们可以通过Laravel的子查询语法复刻原SQL的嵌套逻辑,以下是两种可行写法:
写法一:分步构建子查询
// 先构建内层子查询:按updated_at排序取前20条 $subQuery = TableA::orderByRaw('updated_at ASC NULLS FIRST')->limit(20); // 基于子查询执行外层逻辑:随机排序后取5条 $result = DB::table($subQuery, 'sub') ->orderByRaw('random()') ->limit(5) ->get();
写法二:使用fromSub链式调用(Laravel 5.6+支持)
$result = TableA::fromSub( TableA::orderByRaw('updated_at ASC NULLS FIRST')->limit(20), 'sub' )->orderByRaw('random()') ->limit(5) ->get();
两种写法的逻辑完全匹配原SQL:先通过内层查询锁定最新的20条数据,再对这20条做随机排序,最终返回5条结果。
内容的提问来源于stack exchange,提问作者Abhishek Anand
相关产品推荐
相关产品推荐

