Не полученная запись, если она уже поднята, Laravel 5.7 (система викторины) - PullRequest
0 голосов
/ 23 января 2019

Я создаю систему викторины в Laravel 5.7 , и теперь я выбираю вопросы из базы данных, и мне нужно применить условие, что если пользователь попытался ответить на вопрос, то не показывать этот вопрос пользователю. опять же, для этого я сделал базу данных с именем attempted_questions и два поля там как user_id и question_id и применил следующий код в контроллере:

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 в базе данных, и после этого я получаю случайные вопросы из базы данных и после этой проверки проверяю, есть ли уже принятый вопрос в базе данных? если нет, то покажите его, в противном случае выведите сообщение , но проблема здесь в том, что он также получает вопрос, который уже занят

Ответы [ 3 ]

0 голосов
/ 23 января 2019

вы должны игнорировать идентификатор текущего запроса в модели Вопрос, также я не могу видеть его, я думаю, что так

1

'Question' => ['required', 'description', Rule :: unique ('user') -> ignore ($ question-> id)] * ​​1004 *

надеюсь, что это поможет!

0 голосов
/ 23 января 2019

Я бы выбрал следующее решение:

Question::whereDoestHave('attempts', function($query) {
     $query->where('user_id', Auth::id());
})->inRandomOrder()->take(1)->get();

Это будет работать, если вы определили следующее в своей модели вопросов:

public function attempts() {
    return $this->hasMany('App\Models\AttemptedQuestion');
}
0 голосов
/ 23 января 2019

У вас есть логическая ошибка. Вы берете новый случайный вопрос в цикле 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;
    }
}

Но это не проверено.

Надеюсь, это поможет

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