2017-07-18 41 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