gpt4 book ai didi

php - 已领取则不领取记录,Laravel 5.7(测验系统)

转载 作者:搜寻专家 更新时间:2023-10-30 22:24:58 25 4
gpt4 key购买 nike

我正在 中进行测验系统Laravel 5.7 现在我正在从数据库中获取问题,我必须应用这样的条件,即如果用户尝试提出问题,则不再向用户显示该问题,为此我创建了一个名为 attempted_questions 的数据库和其中的两个字段为user_idquestion_id并在 Controller 中应用以下代码:

class NewTestController extends Controller
{
protected $question_id;
public function nextQuestion(Request $request) {
$attempted_questions = new AttemptedQuestion;
$attempted_questions->user_id = Auth::id();
$attempted_questions->question_id = $request->attempted;
$attempted_questions->save();
$question = Question::inRandomOrder()->first();
$attempted = AttemptedQuestion::all();
foreach ($attempted as $attempted) {
while ($question->id == $attempted->question_id) {
$question = Question::inRandomOrder()->first();
$this->question_id = $question->id;
}
}
return $this->question_id;
}
}

首先我从 AJAX 获得尝试的问题,然后将当前用户和 question_id 存储在数据库中,然后我从数据库中获取随机问题,然后检查所采取的问题是否已经在数据库中?如果没有,则显示它,否则显示一条消息, 但这里的问题是它还提取了已经被采纳的问题

最佳答案

您有一些逻辑错误,您在 while 循环中提出了一个新的随机问题,同时逃避了前面的尝试问题,这就是我的意思:

假设您有 3 个问题 [1,2,3] 和 2 个尝试的问题 [1, 2]。

所以在你的foreach循环你在 [1, 2] 上循环,现在你在第一个尝试的问题上,它有 question_id 1,此时您正在提出一个新问题,假设它的 question_id是 2。然后进入下一个迭代,第二个 attempted_question其中有 question_id 2。

在这里,您将最后的结果与当前的 attempted_question 进行比较, 相等所以满足条件$question->id == $attempted->question_id所以你选择了一个新问题,碰巧你得到的问题 id 为 1。此时你不会检查它是否等于第一个 attempted_question因为我们已经从 $attempted_questions 中跳过了它大批。

更好的解决方案如下:

全部拿走attempted_questions id 和使用 whereNotIn获取所有未尝试的问题。

$attempted = AttemptedQuestion::pluck('question_id');
$question = Question::whereNotIn('id', $attempted)->inRandomOrder()->first();

现在你有你正在寻找的问题。

但是如果当前用户试图回答它,你就会逃跑,所以你可能需要添加一些 where AttemptedQuestion 的声明对于当前用户如下:
$attempted = AttemptedQuestion::where('user_id', Auth::id())->pluck('question_id');

所以你最终可能会得到这样的结果:
class NewTestController extends Controller
{
public function nextQuestion(Request $request) {
$attempted_questions = new AttemptedQuestion;
$attempted_questions->user_id = Auth::id();
$attempted_questions->question_id = $request->attempted;
$attempted_questions->save();
$attempted = AttemptedQuestion::where('user_id', Auth::id())->pluck('question_id');
$question = Question::whereNotIn('id', $attempted)->inRandomOrder()->first();

return $question->id;
}
}

但它没有经过测试。

希望能帮助到你

关于php - 已领取则不领取记录,Laravel 5.7(测验系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54320059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com