2017-07-18 40 views
0

我知道Model :: insert()但是它的關聯關係呢?Laravel多插入和它的關係

我們知道我們可以有100個問題表格提交之後,但相應的問題有大約4回答(對於選擇題)

我們的問題的數據是這樣的

$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'] 
    ... 
] 

關係

  • 問題有很多答案
  • 問題有很多正確答案

我們正試圖在一次

上傳了很多問題,我們可以清楚地看到,如果我們不出去laravel創造否則我們將運行N + 1個問題,爲100問題,我們可以大概需要100 + 400 + 100個查詢效率極低?

如果問::插入()返回插入問題的ID那麼這將是容易的,但它只是返回布爾..

反正是有解決這樣的問題,而無需使用N + 1點的問題。

我試着用n + 1個後臺作業,但它確實是極其緩慢:(

任何解決辦法和黑客將是確定:(

+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 e網絡請求不需要等到所有數據都保存完畢。

+0

你好。你首先試圖插入100個問題不是很慢嗎? 是的,你的答案是第一位的。 – user80946

+0

不,100個查詢不是太多。除非您的計算機使用已經超出了他的限制,否則標準查詢只需要幾分之一秒。 100/200查詢將最多花費幾秒鐘。如果你買不起,唯一的解決方案是在作業中使用異步代碼。 – gbalduzzi

+0

我剛剛給了100例如兄弟:)它可以是1000.有沒有解決方案? – user80946