Альтернатива использованию сессий без необходимости делать слишком много запросов к базе данных? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть приложение для викторин, которое имеет внешний интерфейс 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 не имеют состояния и поэтому использование сессий не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...