2014-11-24 34 views
5
使用updateOrCreate多個數據插入

我已經使用以下刀片陣列插入多個條目LaravelEloquent ORM在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($attributes = array('key' => 'value'), $values = array('key' => 'value')); 

我的問題是如何編輯上述插入片段,使我可以用它Model::updateOrCreate。我的$attributes字段是'fk_workouts_id','fk_users_id','fk_exercises_id',其餘部分在$values中進行更改。

我不知道如何實現這一點。請幫助...

+0

雄辯不能插入/更新多行,你需要逐一處理它們。 'insert'方法實際上是'Query \ Builder',它根本不使用Eloquent特性(例如時間戳等)。 – 2014-11-24 15:56:25

+0

是否有'Eloquent'或'查詢\ Builder'任何其他方式,我可以創建數據是否存在@JarekTkaczyk錄入或更新。因爲我需要更新或創建近20-50個數據是一個很好的做法嗎? – Ronser 2014-11-25 03:46:53

+0

以何種方式的良好習慣?你可以寫3行代碼,並讓Eloquent完成這項工作,或者說13行代碼,你可以在這裏完成工作。雄辯有'firstOrNew'方法,這是要走的路。 – 2014-11-25 07:50:32

回答

6

你可以嘗試像,

第一種方式

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

我覺得你與laravel的定製框架內工作,所以你必須UpdateOrCreate方法,因爲laravel不提供這樣的方法,如果我的假設是真的比寫在下面的代碼可能b以供您的應用程序非常有用

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 
    } 
} 

祝你好運... :)

+0

查詢將在整個'foreach'執行?有沒有辦法儘量減少查詢? – Ronser 2014-12-01 10:49:02

+0

我不這麼認爲,我們會爲此需求提供解決方案。但是,如果我發現那麼肯定會回覆你.... – Neo 2014-12-01 11:50:25