简化Laravel的updateOrCreate方法,用于更新多行

时间:2017-12-14 01:00:53

标签: php laravel eloquent laravel-5.5

我使用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')]);

2 个答案:

答案 0 :(得分: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是我的模型类,它有一个映射到它的数据库表。

方法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));
} 

像这样。

答案 1 :(得分: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")]);
    }
});