Что я хочу :
grade
того, что пользователь ответил в базе данных, если существует, и получить оценку этого ответа. Что я имею :
3
таблицы, short_answer
, sa_sa_answer
, short_answer_answer
. short_answer
есть вопрос, и у каждого вопроса есть много ответов, расположенных в таблице short_answer_answer
и оценка также включена там, вопрос может иметь 1 или более ответ. Какой у меня код:
контроллер
foreach($sa_question_id as $key => $value){ $sa = ShortAnswer::with('answers')->find($sa_question_id[$key]); $possible_answers = []; foreach($sa->answers as $possible_answer){ $possible_answers[] .= strtolower($possible_answer->answer); } if(in_array(strtolower($sa_answer[$key]), $possible_answers)){ $grade = ShortAnswerAnswer::where('answer', $sa_answer[$key])->get(); echo "plus +1. Grade is: " . $grade->grade . "<br>"; } }
Проблема в:
Я просто получаю ответ, где ответ равен ответу пользователя. Но что, если у меня ДВЕ один и тот же ответ и другой grade
и, очевидно, другой вопрос. Он может выбрать неправильный.
Примечание. Я использую Laravel5.1
Обновление: структура таблицы
short_answer
– name
– question
sa_sa_answer
– short_answer_id
– short_answer_answer_id
short_answer_answer
– answer
– grade
Обновить
Я уже решил эту проблему, однако никто не получил щедрость, но если бы вы могли ответить на этот вопрос , я могу дать вам щедрость плюс 2 галочки и голосование, мне просто нужно больше помочь с этим. Это также связано с этим вопросом. Через три дня щедрот исчезнет.
Мы можем решить эту проблему, используя один запрос:
$questions = ShortAnswer::with('answers') ->whereIn('id', $sa_question_id) ->whereHas('answers', function ($query) use ($sa_answer) { $placeholders = join(",", array_pad([], count($sa_answer), "?")); $query->whereRaw("LOWER(answer) IN $placeholders", $sa_answer); }) ->get(); foreach ($questions as $question) { foreach ($question->answers as $answer) { echo 'plus +1. Grade is: ' + $answer->grade}."; } }
Это оптимизирует цикл, поэтому нам нужно только один раз запросить базу данных для всех вопросов и ответов. Он также решает проблему в вопросе, потому что запрос поддерживает отношения между вопросом и ответом, поэтому мы не будем непреднамеренно выбирать неправильные ответы на вопросы.
Эта часть вашего кода:
$grade = ShortAnswerAnswer::where('answer', $sa_answer[$key])->get();
Вы получаете ответы от ShortAnswerAnswer
которые равны $sa_answer[$key]
, нет никакого условия, чтобы указать, отвечает ли ответ на правильный вопрос, который вы ожидали.
Итак, чтобы решить вашу проблему, нужно также указать на этот вопрос. Подобно:
$grade = ShortAnswerAnswer::where(['answer' => $sa_answer[$key], 'question_id' => $key])->get();
P / s: Эта часть:
foreach($sa_question_id as $key => $value){ $sa = ShortAnswer::with('answers')->find($sa_question_id[$key]); ... }
Тогда $sa_question_id[$key]
– ровно $value
.