这可能更像是一个概念性问题,但我试图找到一种最佳方式来制作一个一次显示一个测验问题的视图并检查答案。
目前我的MySQL表格包含以下列:id,category_id,quiz_question,answer_one,answer_two,answer_three,correct_answer。
我的控制器使用以下内容来获取测验问题:
$quizzes = Quiz::where('category_id',$category_id)->simplePaginate(1);
在我看来,我会完成手动执行asnwer排序的过程
{{$quiz->quiz_question }}
<a onclick="this.innerHTML='Wrong'">{{ $quiz->answer_one }}</a>
<a onclick="this.innerHTML='Right'">{{ $quiz->correct_answer }}</a>
<a onclick="this.innerHTML='Wrong'">{{ $quiz->answer_two }}</a>...etc.
并且可能只是使用JavaScript / JQuery来检查正确的答案。
从概念上讲,这感觉就像是一个非常糟糕的方法,如果它们来自同一个DB表,我仍然不确定如何随机化答案的顺序。总的来说有一个更好的方法来解决这个问题(显示1测验问题,并以随机顺序显示答案,检查没有数据库查询)?提前谢谢。
答案 0 :(得分:2)
请勿以任何形式在客户端保留答案。
相反,只需在客户端获取问题并对其进行分页即可。如果您绝对需要逐个验证答案,则启动AJAX请求。
或者你可以让这个人尝试整个测验并将问题发布给用户&#39;在服务器端回答并验证它们。然后你返回结果/得分/答案。
关于在没有数据库查询的情况下进行检查的查询,您不应该这样做。如果你绝对需要它,那么将答案保存在一个对象中,而不是在DOM中。再说一遍,它不能再被推荐&#34;。
修改强>
您应该先将它分成这些表格。您无法在没有第一张表的黑客的情况下随机化选项的显示顺序。
并且不要将列命名为answer_one,answer_two,answer_three,correct_answer。以这种方式,通过列名correct_answer
识别答案的唯一方法。列名不应该提供正确答案的提示。它应该存储在其他地方。
问题
id
question - the question body
类别
id
category - name of the category
question_categories(一个问题可能属于多个类别)
id
question_id
category_id
选项
id
question_id
option - option text
答案
id
question_id
option_id
现在你要做的是随机化选项的顺序
$questions = Question::where('category_id', $category_id)->
with(['options' => function ($query) {
$query->orderBy(DB::raw('RAND()'));
}])
->get();
要随机订购我们使用的选项ORDER BY RAND()
。
现在您只需发送option_id
并可以检查它是否是服务器端的正确答案。
您可以使用以下型号。
您可以使用以下关系。
但创建一个QuestionCategory模型并不能很好地扩展。因此,如果您不想这样做,您可以使用多态关系。您可以使用类别表来存储基本上所有类别的类别,而不仅仅是问题类别。在这种情况下,您需要修改categories
表以添加分类法的类型。如果您不了解任何这种多态关系的事情,请在官方的Laravel文档中找到它https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations