2017-12-22 17 views
0

をループすることで説得力のモデルの複数のインスタンスを更新する私は、次の表を表しクイズモデルがあります:としてこの回答の連想配列

+----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+----------------+------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| title   | varchar(191)  | NO |  | NULL |    | 
| is_correct_ans | tinyint(1)  | NO |  | NULL |    | 
| user_id  | int(11)   | NO |  | NULL |    | 
| quiz_id  | int(11)   | NO |  | NULL |    | 
| created_at  | timestamp  | YES |  | NULL |    | 
| updated_at  | timestamp  | YES |  | NULL |    | 
+----------------+------------------+------+-----+---------+----------------+ 

思う:

+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| title  | varchar(191)  | NO |  | NULL |    | 
| user_id  | int(11)   | NO |  | NULL |    | 
| lesson_id | int(11)   | NO |  | NULL |    | 
| explanation | text    | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 

そして、別のモデルQuizAnswerを5つの選択肢の中から1つを選択します。この5つの答えのそれぞれはクイズに属し、そのうちの1つは正解です。私はクイズを保存すると、私も答えを保存(そしてそれはis_correct_answerかどうか)QuizControllerの店舗()メソッドでは、同時に:

public function store(QuizRequest $request) 
    { 

     $options = [ 
      'option_a' => $request->input('option_a'), 
      'option_b' => $request->input('option_b'), 
      'option_c' => $request->input('option_c'), 
      'option_d' => $request->input('option_d'), 
      'option_e' => $request->input('option_e'), 
     ]; 
     // This variable is used for comparison 
     $correctAns = $request->input('is_correct_ans'); 

     $quiz = new Quiz($request->all()); 
     auth()->user()->quizzes()->save($quiz); 

     foreach ($options as $optionKey => $optionValue) { 
      $answer = new QuizAnswer; 
      $answer->title = $optionValue; 
      $answer->user_id = auth()->id(); 
      $answer->quiz_id = $quiz->id; 
      if($correctAns == $optionKey){ 
       $answer->is_correct_ans = true; 
      } else { 
       $answer->is_correct_ans = false; 
      } 
      $answer->save(); 
     } 

     return redirect()->back(); 
    } 

この店は、()メソッドが正常に動作しますが、問題具体的には、私はのためのループ内で立ち往生しています

public function update(QuizRequest $request, Quiz $quiz) 
    { 
     // dd($request->all()); 
     $options = [ 
      'option_a' => $request->input('option_a'), 
      'option_b' => $request->input('option_b'), 
      'option_c' => $request->input('option_c'), 
      'option_d' => $request->input('option_d'), 
      'option_e' => $request->input('option_e'), 
     ]; 
     $correctAns = $request->input('is_correct_ans'); 

     foreach ($options as $optionKey => $optionValue) { 
      foreach ($quiz->answers as $answer) { 
       $answer->title = $optionValue; 
       $answer->user_id = auth()->id(); 
       $answer->quiz_id = $quiz->id; 
       if($correctAns == $optionKey){ 
        $answer->is_correct_ans = true; 
       } else { 
        $answer->is_correct_ans = false; 
       } 
       $answer->save(); 
      } 
     } 

     $quiz->user_id = auth()->id(); 
     $quiz->title = $request->input('title'); 
     $quiz->explanation = $request->input('explanation'); 
     $quiz->lesson_id = $request->input('lesson_id'); 
     $quiz->save(); 

     return redirect()->back(); 
    } 

:私は(一度にクイズやQuizAnswersの両方)のモデルを更新しようとするとされます。内部のforeachループがすべての回答の値を現在の$optionValueで更新するため、回答を更新できません。 $ options配列の最後の値が「i」を、たとえば、あるのであれば、私は私のquiz_answersテーブル内のこのようなものに終わるだろう:

+----+-------+----------------+---------+---------+---------------------+---------------------+ 
| id | title | is_correct_ans | user_id | quiz_id | created_at   | updated_at   | 
+----+-------+----------------+---------+---------+---------------------+---------------------+ 
| 1 | i  |    1 |  2 |  1 | 2017-12-22 12:25:00 | 2017-12-22 17:28:44 | 
| 2 | i  |    1 |  2 |  1 | 2017-12-22 12:25:00 | 2017-12-22 17:28:44 | 
| 3 | i  |    1 |  2 |  1 | 2017-12-22 12:25:00 | 2017-12-22 17:28:44 | 
| 4 | i  |    1 |  2 |  1 | 2017-12-22 12:25:00 | 2017-12-22 17:28:44 | 
| 5 | i  |    1 |  2 |  1 | 2017-12-22 12:25:00 | 2017-12-22 17:28:44 | 
+----+-------+----------------+---------+---------+---------------------+---------------------+ 
+0

「is_correct_ans」の名前を「is_correct」に変更します。更新するときには、答えのIDを渡す必要があります。あなたが "更新"できない場合、現在の回答をすべて削除して新しい回答を作成するだけです。あなたが説明するものは、クイズの答え(5)ごとに、$ option(5)*の各オプションに対して内部ループを25回実行するために起こります。 5 * 5 = 25 – Kyslik

+0

しかし答えは実際には "更新されています"。私の問題は、単一の 'answer'モデルを単一の' $ optionValue'と同期させておくことができないことです。なぜ私はそれが起こっているのかわかりません、私はちょうど私がそれを解決することができますか分かりません – Eisenheim

+0

私は答えを保存します(QuizControllerのストア())、私はこれを行うことができます: foreach($ options as $ optionKey => $ optionValue) { $ answer = new QuizAnswer; }の更新中に ' は、私はこのような何かを行うことができたい: ' foreachの{($ $オプションキー=> $ optionValueなどのオプションを) $答え= //魔法のクイズの単一答えを得る } ' – Eisenheim

答えて

0

これは私が、array_keys()のおかげで、それを解決する方法である:

$optionKey = array_keys($options); 
    $i = 0; 
    foreach ($quiz->answers as $answer) { 
     // foreach ($options as $optionKey => $optionValue) { 
      $answer->title = $options[$optionKey[$i]]; 
      $answer->user_id = auth()->id(); 
      $answer->quiz_id = $quiz->id; 
      if($correctAns == $optionKey[$i]){ 
       $answer->is_correct_ans = true; 
      } else { 
       $answer->is_correct_ans = false; 
      } 
      $answer->save(); 
      $i++; 
    // } 
    }