在 Laravel 中使用 updateOrCreate 进行多数据插入

Posted

技术标签:

【中文标题】在 Laravel 中使用 updateOrCreate 进行多数据插入【英文标题】:Using updateOrCreate for multiple data insert in Laravel 【发布时间】:2015-01-22 06:46:55 【问题描述】:

我在 Laravel Eloquent ORM987654321@ 中使用了以下 insert array 插入多个条目

$i = 0;
foreach($exerciseValArray as $kkey=>$exerciseValue)
    if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == '')
        return Response::JSON(array('errors'=>array('Error in workout exercise section')));
       
    $exerciseData = explode(',',$exerciseValue['exercise']);
    foreach($exerciseData as $exerciseid)
        $insertArray[$i]['fk_workouts_id'] = $id;
        $insertArray[$i]['fk_users_id']    = $userId;
        $insertArray[$i]['fk_exercises_id']= $exerciseid;
        $insertArray[$i]['section']        = $exerciseValue['section_type'];
        $insertArray[$i]['status']         = 1;
        $insertArray[$i]['item_index']     = $index+$kkey+1;
        $insertArray[$i]['updated_at']     =  $workoutDetails['updated_at'];
        $i++;
    

WorkoutExercise::insert($insertArray);

上面的代码工作正常,并将数据数组插入到数据库中。

我已经学会了Model::updateOrCreate的用法,并在我的一些模块中成功使用了它(即)

Model::updateOrCreate($attributes = array('key' => 'value'), $values = array('key' => 'value'));

我的问题是如何编辑上面的插入 sn-p 以便我可以在其中使用Model::updateOrCreate。我的 $attributes 字段是 'fk_workouts_id'、'fk_users_id'、'fk_exercises_id' 和 $values 中的其余部分要更改。

我不知道如何实现这一点。请帮忙...

【问题讨论】:

Eloquent 不能插入/更新多行,需要一一处理。 insert 方法实际上是 Query\Builders,它根本不使用 Eloquent 功能(例如时间戳等)。 如果数据存在@JarekTkaczyk,EloquentQuery\Builder 是否还有其他方法可以创建条目或更新。因为我需要更新或创建近 20-50 个数据,是不是一个接一个的好习惯?? 好的做法是什么?您可以编写 3 行代码让 Eloquent 完成这项工作,或者说 13 行代码让您完成这项工作。 Eloquent 有firstOrNew 方法,这是要走的路。 Jarek Tkaczyk 已经给了你答案,没有办法解决。你在找什么? (因为您添加了赏金) 【参考方案1】:

你可以试试,

第一道

 $user = User::firstOrNew(array('name' => 'satish'));
 $user->field = 'value';
 $user->save();

如果找到,它将检查用户name=satish,然后将其返回。如果找不到,则创建新的并返回。然后就可以设置字段值了。

检查此链接。 http://laravel.com/docs/4.2/eloquent#insert-update-delete

第二种方式 手动检查记录是否存在。

 $arr=array('field'=>"value");
 $row = User::find($id);
  if ($row === null) 
       //Insert your record 

   else 
       //update your record
  

更新

您也可以使用updateOrCreate - 更新现有模型或创建新模型(如果不存在)。 updateOrCreate 持久化模型,因此无需调用 save()

例子-

// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99]
);

【讨论】:

如何使用 updateOrCreate 更新或创建多行数据,但您更新的每一行都在更新数据库中的不同列? 将 updateOrCreate 放入循环中【参考方案2】:

我认为您正在使用 laravel 的自定义框架,因此您有 UpdateOrCreate 方法,因为如果我的假设正确,laravel 不提供此类方法,而不是下面的编写代码可能对您的应用程序有用

foreach($exerciseValArray as $kkey=>$exerciseValue)

  if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == '')
     return Response::JSON(array('errors'=>array('Error in workout exercise section')));
     
  $exerciseData = explode(',',$exerciseValue['exercise']);
  $attr_array = array('fk_workouts_id','fk_users_id','fk_exercises_id','section','status','item_index','updated_at');

  foreach($exerciseData as $exerciseid)

      $val_array = array($userId,$exerciseid,$exerciseValue['section_type'],1,$item_index,$workoutDetails['updated_at']);
      WorkoutExercise::updateOrCreate($attr_array,$val_array);
  

但是如果您没有使用这种自定义框架,请尝试使用下面的代码,它可能会正常工作

foreach($exerciseValArray as $kkey=>$exerciseValue)

  if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == '')
    return Response::JSON(array('errors'=>array('Error in workout exercise section')));
     
  $exerciseData = explode(',',$exerciseValue['exercise']);

  foreach($exerciseData as $exerciseid)

    $item_index = $index+$kkey+1;

    // Retrieve the record by the fk_workouts_id, or create it if it doesn't exist...
    $exercise = WorkoutExercise::firstOrCreate($attributes = array('fk_workouts_id' => $id));

    /* assign the values of other fields to store in database table*/
    $exercise->fk_users_id      = $userId;
    $exercise->fk_exercises_id  = $exerciseid;
    $exercise->section          = $exerciseValue['section_type'];
    $exercise->status           = 1;
    $exercise->item_index       = $item_index;
    $exercise->updated_at       = $workoutDetails['updated_at'];
    $exercise->save(); // update the record
  

祝你好运...:)

【讨论】:

查询将在整个foreach 中执行,对吗??有没有办法最小化查询?? 我不认为我们会有满足此要求的解决方案。但是,如果我发现了,那肯定会回复给你....

以上是关于在 Laravel 中使用 updateOrCreate 进行多数据插入的主要内容,如果未能解决你的问题,请参考以下文章

updateOrCreate 在 laravel 中导致 ErrorException

updateOrCreate - Laravel 中的批量分配异常

Laravel:使用同步或 updateOrCreate 更新父表和子表?

PHP Laravel,方法 updateOrCreate 的替换

laravel中firstorcreate和updateorcreate的操作区分

updateOrCreate在Laravel Eloquent中不起作用