У вас есть логическая ошибка. Вы берете новый случайный вопрос в цикле while, избегая предыдущих заданных вопросов, вот что я имею в виду:
Предположим, у вас есть 3 вопроса [1,2,3]и 2 вопроса [1, 2].
Итак, в вашем цикле foreach
вы включаете цикл [1, 2], теперь вы находитесь на первом ответе на вопрос, у которого question_id
равен 1, вв этот момент вы задаете новый вопрос, скажем, его question_id
равен 2. затем переходит к следующей итерации, вторая attempted_question
имеет question_id
2. 2. 1010 *
здесь вы сравниваете последний результатс током attempted_question
, и он равен, так что он удовлетворяет условию $question->id == $attempted->question_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;
}
}
Но это не проверено.
Надеюсь, это поможет