Laravel Eloquent如何单查询从最新20条记录中随机选取5条数据
实现方案
你可以直接借助 Eloquent 提供的子查询构造方法实现,最终生成的 SQL 和你提供的原生逻辑完全一致,仅触发一次数据库查询,无需后续集合处理。
适用 Laravel 5.6+ 版本(推荐写法)
假设你的 Eloquent 模型Demo对应表DemoTable,直接使用fromSub构造嵌套查询即可:
$randomData = Demo::fromSub( Demo::orderByDesc('ShippingDate')->limit(20), 'temp_table' )->inRandomOrder()->limit(5)->get();
低版本 Laravel 兼容写法
如果 Laravel 版本低于 5.6 没有fromSub方法,可通过DB::raw拼接子查询实现:
use Illuminate\Support\Facades\DB; $randomData = Demo::select(DB::raw('temp_table.*')) ->from(DB::raw('(SELECT * FROM DemoTable ORDER BY ShippingDate DESC LIMIT 20) AS temp_table')) ->inRandomOrder() ->limit(5) ->get();
说明
- 上述写法生成的SQL执行逻辑和你提供的原生语句完全一致:先取最近20条数据作为临时表,再从临时表随机取5条
inRandomOrder会自动适配当前数据库的随机排序语法,MySQL环境下对应ORDER BY RAND()- 全程仅触发一次数据库查询,不会在查询结果返回后做二次筛选、排序处理
内容的提问来源于stack exchange,提问作者farshidpg
相关产品推荐
相关产品推荐

