2017-07-18 7 views
0

私はModel :: insert()について知っていますが、その関連関係はどうですか?Laravel Multi Insertionとその関係

私たちは、フォーム送信後、我々は100疑問を持つことができます知っているが、対応する質問は、私たちの質問データはこの

$question = [ 
'1' =>[ 
     'name'='Who is first president of America'? 
     ... 
    ] 
    ... 
'100' => 
    'name' = 'When did Christopher Colombus discovered America' 
    .... 

    ... 
] 

$answers = [ 
    '1'=> 
     [ 
      '1' => 'Wilston Churcil', 
      '2' => 'George Washinton' 
      .... 
     ] 
     ... 
    ... 
] 

$correct_answer = [ 
    '1'=>['2'] 
    ... 
] 

のような関係

    を見て(複数の選択肢の質問については)約4答え

    を持っています

  • 質問には多くの回答があります
  • 質問には多くの正解があります
  • 我々はlaravelのために行っていない場合我々は明らかにそうでないと、私たちは、n + 1つの問題を実行すると、100の質問のために私たちは、おそらく必要があるかもしれ作成見ることができます一度

    に多くの質問をアップロードしようとしている

100 + 400 + 100クエリは非常に非効率的ですか?

質問の場合::挿入()が、それは簡単だろう挿入質問のIDを返したが、それはただのn + 1つの問題を使用せずに、このような問題を解決するために、とにかくそこ..です

ブールを返します。私は、n + 1とバックグラウンドジョブを使用してみましたが、それは本当に非常に遅いです:(

溶液やハックはOKだろう:(

+0

https://laravel.com/docs/5.4/eloquent-relationships#inserting-and-updating-related-modelsには、モデルオブジェクト経由で挿入するオプションがあります。 'saveMany'はあなたが必要とするように見えます – apokryfos

+0

はn + 1問題を作成しませんか? あなたはすべての質問をすべて掴んで保存し、回答とそれに対応する回答を挿入する必要がありますか? – user80946

+0

次の質問を挿入する前に質問とその回答を挿入することは考えられません。また、N + 1の問題は、挿入ではなく選択で行うことです。 – apokryfos

答えて

1

hasMany(..)->saveMany([$array])方法

は、すべてのオブジェクトを保存するためにのみ1クエリを実行します$配列内。あなたはまだかかわらず、すべてのあなたの答えを反復処理する必要があります。

foreach($questions as $key => $question) { 
    $answerArray = [] 
    foreach($answers[$key] as $answer) { 
     $answerArray[] = new App\Answer($answer[1], $answer[2], $answer[3], ...) 
    } 
    $q = new App\Question($question['name'], ....); 
    $q->save(); 
    $q->answers()->saveMany($answerArray); 
} 

これはまだ遅すぎる場合、私は(あなたの唯一のオプションは、別のタスクにデータを保存するジョブを作成することだと思いますOfficial docs about jobs)、th電子メール要求は、すべてのデータが保存されるまで待つ必要はありません。

+0

こんにちは。あなたは最初に100の質問を挿入しようとしている最初の場所では遅いではない? はい、あなたの答えが最初です。 – user80946

+0

いいえ、100個のクエリが多すぎるわけではありません。コンピュータの使用量がすでに限界を超えていない限り、標準クエリには数分の1秒かかりました。 100/200クエリは、最大で数秒かかるでしょう。余裕がない場合、唯一の解決策は、ジョブで非同期コードを使用することです。 – gbalduzzi

+0

私はちょうど100例をbroとして与えました:) 1000にすることができます。それに対する解決策はありますか? – user80946