在Laravel中获取随机数据而不重复

时间:2018-01-04 15:44:15

标签: laravel eloquent laravel-eloquent

我使用以下方法随机收到问题:

public function mcq($id)
{
    $questions = Chapter::find($id)->questions()->orderByRaw("RAND()")->paginate(1);
    return view('pages.mcq')->withQuestions($questions);
}

如何避免重复问题。

4 个答案:

答案 0 :(得分:2)

您可以尝试此inRandomOrder()

$questions = Chapter::find($id)->questions()->inRandomOrder()->get();

答案 1 :(得分:1)

使用随机排序时,您无法保持相同的结果。

如果你真的想让每个用户随机使用,但保持分页工作,你可以创建一个随机索引并将其保存在会话中。像这样:

Chapter::find(1)->questions()->whereIn('id', session('random')[$pageIndex])->get();

然后在每个页面使用它:

produce  in this order          and read like this
1 2 3 4 5 
_ _ _ _ _
a b c d e                       1 [a b c d e] 
a b c d e                       2 [a b c d e]
a b c d e     -------->         3 [a b c d e]
z y x w v                       4 [z y x w v]
g h i j k                       5 [g h i j k]
_ _ _ _ _

您还需要manually create a paginator

答案 2 :(得分:0)

您可以将会话变量中当前提取的问题ID设置为数组。 下次当您查询会话数组的问题检查时,如果它存在,您可以在查询中传递这些ID

 ->whereNotIn('id', [1, 2, 3])

这样就不会重复了。

答案 3 :(得分:0)

你不能依赖雄辩来做到这一点,你必须添加一个验证层,你可以在会话中存储用户看到的问题,然后检查id是否在那个已经看到问题的数组中 通过使用这样的东西

session()->put('questions', array_merge(session('questions'), $id));

然后检查

Chapter::find($id)->questions()->whereNotIn('id',session('questions'))->inRandomOrder()->get();