Laravel 5.4如何从按score_total排序的前10条数据中随机取4条?
解决Laravel查询中
inRandomOrder不生效的问题 你的问题核心在于Laravel查询构造器的链式调用是构建单条SQL,而非分步执行。原代码Cars::orderBy('score_total','DESC')->take(10)->inRandomOrder()->take(4)->get()最终生成的SQL逻辑是:先按score_total降序,再对全表随机排序,最后取4条——这完全不符合你“先取前10条高分数据,再从中随机选4条”的需求。
下面提供两种靠谱的解决方案,你可以根据场景选择:
方案1:集合层面处理(简单直观,适合小数据量)
先获取前10条数据的集合,再利用Laravel集合的random()方法直接随机抽取4条:
// 先获取按score_total降序的前10条数据集合 $top10Cars = Cars::orderBy('score_total', 'DESC')->take(10)->get(); // 从集合中随机取4条 $random4Cars = $top10Cars->random(4);
这种方法的优点是代码简洁易懂,缺点是会把10条数据全部加载到内存中,适合数据量不大的场景。
方案2:数据库层面处理(更高效,适合大数据量表)
通过子查询先筛选出前10条高分数据,再在这个子查询结果中随机取4条,让数据库完成所有逻辑:
$random4Cars = Cars::fromSubquery( // 子查询:获取前10条高分数据 Cars::orderBy('score_total', 'DESC')->take(10), 'top_cars' // 给子查询结果起别名 )->inRandomOrder()->take(4)->get();
或者用whereIn的方式,先获取前10条的ID,再基于ID随机查询:
// 先获取前10条数据的ID集合 $top10Ids = Cars::orderBy('score_total', 'DESC')->take(10)->pluck('id'); // 根据ID随机取4条 $random4Cars = Cars::whereIn('id', $top10Ids)->inRandomOrder()->take(4)->get();
这两种写法都会生成更精准的SQL,让数据库只处理必要的数据,性能更优,适合表数据量较大的场景。
内容的提问来源于stack exchange,提问作者user6122500
相关产品推荐
相关产品推荐

