createMany与updateOrCreate等效

时间:2019-03-04 12:21:09

标签: laravel laravel-5 eloquent

当您想在一个调用中“更新或创建”许多记录时,Laravel中的createMany是否有一个updateOrCreate的等效项?

换句话说,是否存在一种updateOrCreateMany函数?

从文档中看,似乎没有一个具有该名称的函数,但是也许有另一种友好的Laravel方法来执行此操作...或者我应该只使用foreach(也许也使用MySQL的{{ 3}}功能)?

2 个答案:

答案 0 :(得分:0)

基于Laravel的documentation,没有像updateOrCreateMany这样的雄辩方法了

如果您有想法,那是有道理的,因为无论如何执行都需要顺序执行。由于某些条目可能会影响前一个条目,因此插入或更新模式不能同时进行。因此,即使有这样的方法,它仍然会在内部使用循环来逐个执行查询。

为进一步澄清,我们假设有一个方法updateOrCreateMany可能会像这样输入数组数组:

Model::updateOrCreateMany([
   [
      'email' => 'x@y.com'
   ],
   [
      'email' => 'x2@y2.com'
   ],
   [
      'email' => 'x@y.com'
   ]
],
[
   [
      'name' => 'X Y'
   ],
   [
      'name' => 'X2 Y2'
   ],
   [
      'name' => 'X Y Updated'
   ]
]);

正如您所看到的,记录3应该更新记录1,因此,您不能仅通过将每个记录与记录1的插入时间的数据库映像进行比较而一次输入所有记录,这样您将输入重复的错误最初不存在以x@y.com开头的电子邮件。

因此,没有updateOrCreateMany方法,因为它不能同时完成,它必须是顺序的,这意味着某种循环机制,如foreach。

顺便问好! +1

有道理吗?

答案 1 :(得分:0)

我建议对数据使用foreach循环并使用updateOrCreate方法

foreach($records as $record){
   Model::updateOrCreate([$record->id, $record->name], [$record->likes, $record->dislikes]);
}