dongshuo8756 2018-03-23 03:50
浏览 443
已采纳

Laravel 5.6 inRandomOrder和OrderBy

How to take datas from Database like this. But randomly and never duplicate.

$questions = Question::orderBy("created_at", 'desc')->skip(0)->take(3)->get();
$inquiries = Question::orderBy("created_at", 'desc')->skip(3)->take(3)->get();
$queries = Question::orderBy("created_at", 'desc')->skip(6)->take(3)->get();
$examinations = Question::orderBy("created_at", 'desc')->skip(9)->take(3)->get();
$inquisitions = Question::orderBy("created_at", 'desc')->skip(12)->take(3)->get();

It works but duplicates.

$questions = Question::inRandomOrder()->limit(10)->get();
$inquiries = Question::inRandomOrder()->limit(10)->get();
$queries = Question::inRandomOrder()->limit(10)->get();
$examinations = Question::inRandomOrder()->limit(10)->get();
$inquisitions = Question::inRandomOrder()->limit(10)->get();
  • 写回答

1条回答 默认 最新

  • doulun0651 2018-03-23 04:03
    关注

    How about you get them all with 1 call and sort them with PHP using collection splice method:

    $all = Question::inRandomOrder()->limit(50)->get();
    
    $questions = $all->splice(0, 10);
    $inquiries = $all->splice(0, 10);
    $queries = $all->splice(0, 10);
    $examinations = $all->splice(0, 10);
    $inquisitions = $all->splice(0, 10);
    

    You could also just save IDs you've already pulled in an array and ignore those when doing new queries with ->whereNotIn() like this:

    $except = []; // We'll save IDs of those pulled already here
    
    $questions = Question::inRandomOrder()->limit(10)->get();
    $except = array_merge($except, $questions->pluck('id')->toArray()); // Add IDs from upper call
    
    // Add ->whereNotIn, to ignore IDs from $except
    $inquiries = Question::inRandomOrder()->whereNotIn('id', $except)->limit(10)->get(); 
    $except = array_merge($except, $inquiries->pluck('id')->toArray()); // Add IDs from upper call
    
    $queries = Question::inRandomOrder()->whereNotIn('id', $except)->limit(10)->get();
    $except = array_merge($except, $queries->pluck('id')->toArray()); // Add IDs from upper call
    
    $examinations = Question::inRandomOrder()->whereNotIn('id', $except)->limit(10)->get();
    $except = array_merge($except, $examinations->pluck('id')->toArray()); // Add IDs from upper call
    
    $inquisitions = Question::inRandomOrder()->whereNotIn('id', $except)->limit(10)->get();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?