Laravel 批量插入许多具有相同形式的条目

Posted

技术标签:

【中文标题】Laravel 批量插入许多具有相同形式的条目【英文标题】:Laravel bulk insert many entries with same form 【发布时间】:2018-08-27 03:19:48 【问题描述】:

我的目标是使用相同的表单同时插入多条记录。我已经在表单元素中创建了一个函数,它将复制所有字段并使用一个提交按钮传递所有数据。所以视图和传递给控制器​​的数据没有问题。

我有一个数组:

array:8 [▼
  "_token" => "XLQVP4Hbm85SlZDFa6OnjK0LCoMOsrfs8jGCUwMj"
  "id" => null
  "client_id" => array:2 [▼
    0 => "1"
    1 => "1"
  ]
  "sample_code" => array:2 [▼
    0 => "sadasdas"
    1 => "qwewqewqeqweq"
  ]
  "sample_description" => array:2 [▼
    0 => "dasdsad"
    1 => "dsadsadasd"
  ]
  "quantity" => array:2 [▶]
  "analysis_requested" => array:2 [▼
    0 => "dasdsadasd"
    1 => "dsadsadas"
  ]
  "special_instruction" => array:2 [▼
    0 => "asdadasda"
    1 => "asdasdaada"
  ]
]

上面给出的数组只是我从表单中传递的示例数据。这可能是 3、4 等等,取决于用户输入。

如何使用批量插入插入此查询?

这是我在控制器中的代码。

data = array(
        array(
            'client_id' => $input['client_id'][0],
            'sample_code' => $input['sample_code'][0],
            'sample_description' => $input['sample_description'][0],
            'quantity' => $input['quantity'][0],
            'analysis_requested' => $input['analysis_requested'][0],
            'special_instruction' => $input['special_instruction'][0],
            'status' => 'for_testing',
            'created_at' => $date_today,
            'updated_at' => $date_today,
        ),
        array(
            'client_id' => $input['client_id'][1],
            'sample_code' => $input['sample_code'][1],
            'sample_description' => $input['sample_description'][1],
            'quantity' => $input['quantity'][1],
            'analysis_requested' => $input['analysis_requested'][1],
            'special_instruction' => $input['special_instruction'][1],
            'status' => 'for_testing',
            'created_at' => $date_today,
            'updated_at' => $date_today,
        ),
    );

    AnalysisRequest::insert($data);

我将如何通过使用每个循环来简化此代码?顺便说一句,我将如何获得我插入的每个数据的最后一个 id。

如果有人可以提供帮助,我们将不胜感激。 提前致谢。

【问题讨论】:

如果您有适当数组格式的数据,那么您可以使用一个插入函数插入所有数据。 我会在数组内的变量数据中做一个 foreach 吗? 你找到解决方案了吗? 【参考方案1】:

我仍然认为你所做的事情有问题,但这可能是一个解决方案,尽管我认为这不是最好的选择

正如我已经告诉过你的,你应该通过以下方式接收数据

array:2 [▼
  "_token" => "XLQVP4Hbm85SlZDFa6OnjK0LCoMOsrfs8jGCUwMj"
  "items" => array:2 [▼
    0 => [▼
      "client_id" => 1
      "sample_code" => "aaa"
      "sample_description" => "aaa"
      "quantity" => array:2 [▶]
      "analysis_requested" => "aaa"
      "special_instruction" => "aaa"
    ]
    1 => [▼
      "client_id" => 1
      "sample_code" => "bbb"
      "sample_description" => "bbb"
      "quantity" => array:2 [▶]
      "analysis_requested" => "bbb"
      "special_instruction" => "bbb"
    ]
  ]
]

这样就可以了

foreach($data as $item)  AnalysisRequest::create($item); 

但如果你坚持按照自己的方式做事,那么你有很多方法就是其中之一

$newCollection = collect($input);
$datas = $collection->except(['_token', 'id']);

$items = [];
foreach($datas->all() as $field => $data)  // $field is field name
  foreach($data as $key => $value)  // $key is item key
    $item[$key][$field] = $value;
  

 foreach($items as $item)  AnalysisRequest::create($item); 

我建议您观看此视频https://www.youtube.com/watch?v=Efr7SUrBUQw 并重构您的表单以以正确的方式获取数据

【讨论】:

以上是关于Laravel 批量插入许多具有相同形式的条目的主要内容,如果未能解决你的问题,请参考以下文章

删除然后批量插入时的 SQL 死锁

boost flat_map 批量插入

navicat mysql导出数据 批量插入的形式

hibernate nativesqlquery批量插入

Laravel 5.2 中的批量插入

laravel 5.6批量插入json数据