Как получить конкретные данные о классе с использованием Laravel Rloquent?

Что я хочу :

  1. Чтобы получить grade того, что пользователь ответил в базе данных, если существует, и получить оценку этого ответа.

Что я имею :

  1. У меня есть 3 таблицы, short_answer , sa_sa_answer , short_answer_answer .
  2. Теперь в таблице 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 .