我通过使用以下方法随机获得问题:
public function mcq($id)
{
$questions = Chapter::find($id)->questions()->orderByRaw("RAND()")->paginate(1);
return view('pages.mcq')->withQuestions($questions);
}
如何避免重复问题。
你可以尝试这个inRandomOrder()
$questions = Chapter::find($id)->questions()->inRandomOrder()->get();
使用随机排序时,您无法保持相同的结果。
如果你真的想让每个用户随机,但保持分页工作,你可以创建一个随机索引并将其保留在会话中。像这样的东西:
session(['random' => [[1, 18, 5], [4, 3, 8], [3, 9, 14], ....]]);
然后在每个页面使用它:
Chapter::find(1)->questions()->whereIn('id', session('random')[$pageIndex])->get();
您可以将会话变量中当前提取的问题ID设置为数组。下次当您查询会话数组的问题检查时,如果它存在,您可以在查询中传递这些ID
->whereNotIn('id', [1, 2, 3])
所以它不会重复。
你不能依赖雄辩来做到这一点,你必须添加一个验证层,你可以在会话中存储用户看到的问题,然后通过使用某些东西检查id是否不在已经看到的问题的数组中像这样
session()->put('questions', array_merge(session('questions'), $id));
然后检查
Chapter::find($id)->questions()->whereNotIn('id',session('questions'))->inRandomOrder()->get();