У меня есть приложение для викторин, которое имеет внешний интерфейс Vue и внутренний интерфейс Laravel.
Предположим, у меня есть таблица с именем Вопросы с 1000+ вопросами (строками). Каждый вопрос принадлежит многим (или только одному) модулям (другая таблица).
Пользователь выбирает модуль, на который он хочет ответить. Количество вопросов в опросе по умолчанию равно 30. Эти вопросы представляются в случайном порядке из базы данных - по одному за раз и не повторяются до тех пор, пока пользователь не увидит все вопросы для этого модуля в базе данных.
Каков наилучший способ сделать это?
В настоящее время я занимаюсь этим:
Vue (внешний интерфейс) контролирует количество вопросов (по умолчанию 30) - когда это количество достигнуто - тест заканчивается и отображается оценка.
Пользователь выбирает {модуль}, на который он хочет ответить.
Vue отправляет запрос axios GET в /random/all/ndommodule отпуска.
Этот маршрут вызывает метод ModuleController @ random, который возвращает один случайный вопрос (который пользователь раньше не видел) для этого модуля.
public function random(Module $module, $name){
// Get all questions for module.
$questions = $module->questions->shuffle()->pluck('id');
// Get unseenQuestions
$sessionName = 'unseenQuestions_' . $name . strval($module->id); //unseenQuestions_all_2
if (session()->has($sessionName)) {
$unseenQuestions = session()->get($sessionName);
} else {
$unseenQuestions = collect($questions);
}
// Pop new Question
$newQuestionID = $unseenQuestions->shift();;
// Store unseenQuestions OR remove unseenQuestions (if it has no items)
if ($unseenQuestions->count() == 0) {
session()->forget($sessionName);
} else {
session()->put($sessionName, $unseenQuestions);
}
return new QuestionResource(Question::find($newQuestionID));
}
Как вы можете сказать, здесь используются сеансы, чтобы иметь возможность запомнить, какие вопросы у пользователя есть, и он еще не видел. Мне было интересно, есть ли лучший способ обойти это. В идеале я хотел бы иметь некоторую конечную точку API, которая позволяет мне это делать, но я знаю, что API не имеют состояния и поэтому использование сессий не будет работать.