2017-12-14 6 views
0

複数の行を更新するためにupdateOrCreateを使用しています。これは醜いかもしれません。これを単純化するスマートな方法はありますか、またはメソッドは複数の行を保存する方法を提供しますか?複数の行を更新するためのLaravelのupdateOrCreateメソッドの簡略化

RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => 'q1'], ['meta_value' => Input::get('q1')]); 
RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => 'q2'], ['meta_value' => Input::get('q2')]); 
RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => 'q3'], ['meta_value' => Input::get('q3')]); 
RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => 'q4'], ['meta_value' => Input::get('q4')]); 
RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => 'q5'], ['meta_value' => Input::get('q5')]); 
+1

あなたの属性をモデルに入力し、上記のコードをループに入れます。 – webDev

+2

sidenote:大規模なセットを実行している場合、あなたのDBがそれらをサポートしている場合は "upserts"に行くことができますが、これらのクエリの構造はデータベース固有の – lagbox

答えて

1

いつでもforループでラップすることができます。トランザクション内のすべてのものをラップすると、処理速度も向上します。

\DB::transaction(function() { 
    for($i = 1; $i <= 5; $i++) { 
     RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => "q$i"], ['meta_value' => Input::get("q$i")]); 
    } 
}); 
+0

なぜ' $ i <= 5; '配列に6番目の要素があるとどうなりますか? – usrNotFound

+1

@usrNotFound配列はありません。予想される値(1〜5)をループするだけです。しかし、はい、この単純な例は間違いなくforeachにもリファクタリングできます! (Input :: all()を介して)。しかし、入力値を別のクラスにラップする方が良いでしょう! (データベースロジックから 'Input'呼び出しを保持するため) –

1

これは、すでに存在するかどうかを確認して複数のレコードを作成する方法です。 (あなたの属性をモデルに塗りつぶして、上記のコードをループに入れます)。ただ、コード例

foreach($user['did'] as $d){ 
     $user_did_settings = ModelClass::firstOrCreate(array('user_id' => $user_obj->id,"did"=>$d['did'])); 
     //$user_did_settings->view_incoming = $d['view_incoming']; 
     //$user_did_settings->view_all_outgoing = $d['view_all_outgoing']; 
     //$user_did_settings->view_all_incoming = $d['view_all_incoming']; 
     //$user_did_settings->notify_on_incoming = $d['notify_on_incoming']; 
     //$user_did_settings->notify_on_outgoing = $d['notify_on_outgoing']; 
     //$user_did_settings->save(); 
    } 

それが正しい方法かどうかはわからないが、これは私がどのように作成するか、あるいは更新。 それが役立つかどうかを確認してください。上記の例では、UserDidSettingは私のモデルクラスで、DBテーブルがマップされています。

メソッドfirstOrCreateは、そのモデルの新しいオブジェクトを作成するか、またはDBからモデルの既存のオブジェクトを提供します。

更新:(あなたの場合)

foreach($request->all() as $key => $q){ //Based on how you get data (update please) 
    $requestData = RequestData::firstOrCreate(array('r_id' => $rid,'meta_key' => $key,"meta_value"=>$q)); 
} 

このような何か。

+2

であるため、なぜ 'firstOrNew'ではなく、 'create'の場合に追加のクエリを保存するのですか? 'updateOrCreate'は' firstOrNew'を呼び出します – lagbox

+1

私は 'firstOrNew'が' firstOrCreate'より優れていますが、これはLaravelを学んだときに書いた古いコードです。実際にはDBのオーバーヘッドがもう1つあり、 'firstOrNew'を使うべきです。気づいてくれてありがとう。実際には私のモデルはメソッドの中にある属性を持つことができますなぜ私は 'create'を使用したのですか – webDev

関連する問題