Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel中使用updateOrCreate进行多数据插入_Php_Laravel_Laravel 4_Orm_Eloquent - Fatal编程技术网

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

Php 在Laravel中使用updateOrCreate进行多数据插入,php,laravel,laravel-4,orm,eloquent,Php,Laravel,Laravel 4,Orm,Eloquent,我已使用以下插入数组在Laravel中插入多个条目 $i = 0; foreach($exerciseValArray as $kkey=>$exerciseValue){ if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == ''){ return Response::JSON(array('errors'=>array('Error in workout exerci

我已使用以下插入数组在Laravel中插入多个条目

$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
。我的
$属性
字段包括“fk\U训练id”、“fk\U用户id”、“fk\U练习id”以及要更改的
$值
中的其余字段

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

你可以试试

第一条路

 $user = User::firstOrNew(array('name' => 'satish'));
 $user->field = 'value';
 $user->save();
它将检查user
name=satish
,如果找到,则返回它。如果未找到,则创建新的并返回。然后可以设置字段值

检查此链接。

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

 $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]
);

我认为您使用的是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
  }
}

祝您好运……:)

Eloquent无法插入/更新多行,您需要逐个处理它们。
insert
方法实际上是
Query\Builder
s,它根本不使用雄辩的功能(例如时间戳等)。在
elotent
Query\Builder
中,如果数据存在@JarekTkaczyk,是否还有其他方法可以创建条目或更新。因为我需要更新或创建近20-50个数据,所以一个一个地更新或创建数据是一种好的做法吗?好的做法是什么?你可以写3行代码,让雄辩者来做这项工作,或者说13行代码,在你做这项工作的地方。雄辩者拥有第一个或新的方法,这是一条路要走。Jarek Tkaczyk已经给了你答案,没有办法。你在找什么?(因为您添加了赏金)查询将在整个
foreach
中执行,对吗??有没有一种方法可以最大限度地减少查询?我认为我们不会有解决这个问题的方法。但是如果我发现了,那么肯定会返回给您……您将如何使用updateOrCreate来更新或创建多行数据,但您正在更新的每一行都在更新数据库中的不同列?
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
  }
}