Php 简化Laravel';s updateOrCreate方法用于更新多行

Php 简化Laravel';s updateOrCreate方法用于更新多行,php,laravel,eloquent,laravel-5.5,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

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

这就是我通过检查是否已经存在来创建多个记录的方式。(使您的属性可在模型上填充,然后将上述代码放入循环中)
只是一个示例代码:

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表

方法
first或create
将创建该模型的新对象,或从数据库中为您提供该模型的现有对象

更新:(在您的情况下)


类似于此。

这是我通过检查是否已存在来创建多个记录的方式。(使您的属性可在模型上填充,然后将上述代码放入循环中)
只是一个示例代码:

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表

方法
first或create
将创建该模型的新对象,或从数据库中为您提供该模型的现有对象

更新:(在您的情况下)


类似这样的东西。

您可以始终将其包装在for循环中。将整个事务包装在事务中也会加快处理速度

\DB::transaction(function() use ($rid) {
    for($i = 1; $i <= 5; $i++) {
      RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => "q$i"], ['meta_value' => Input::get("q$i")]);
    }
});
\DB::事务(函数()使用($rid){
对于($i=1;$i$rid,'meta_key'=>“q$i”],['meta_value'=>Input::get(“q$i”)];
}
});

您始终可以将其包装在for循环中。将整个事务包装在事务中也会加快处理速度

\DB::transaction(function() use ($rid) {
    for($i = 1; $i <= 5; $i++) {
      RequestData::updateOrCreate(['r_id' => $rid, 'meta_key' => "q$i"], ['meta_value' => Input::get("q$i")]);
    }
});
\DB::事务(函数()使用($rid){
对于($i=1;$i$rid,'meta_key'=>“q$i”],['meta_value'=>Input::get(“q$i”)];
}
});

使您的属性可在模型上填充,然后将上述代码放入循环中。旁注:如果您正在处理大型集合,如果DB支持,您可以选择“向上插入”,但是,您将自己构建这些查询,并被锁定到该数据库中,因为这些查询的结构是特定于数据库的,请在模型上填充属性,然后将上述代码放入循环中。sidenote:如果您正在进行大型集合,如果您的数据库支持它们,您可以选择“升级”,但是您将自己构建这些查询,并被锁定到该数据库中,因为这些查询的结构是特定于数据库的。为什么不
firstOrNew
,并将额外的查询保存在“create”案例中
updateOrCreate
调用
firstOrNew
你是对的
firstOrNew
firstOrCreate
在我的情况下要好,但这是我在学习Laravel时编写的旧代码。实际上,DB和ingnore还有一个开销,我应该使用
firstOrNew
。谢谢你注意到了。实际上,我的模型只能具有方法中的那些属性,这就是为什么我使用
create
为什么不
firstOrNew
并将额外的查询保存在“create”案例中
updateOrCreate
调用
firstOrNew
你是对的
firstOrNew
firstOrCreate
在我的情况下要好,但这是我在学习Laravel时编写的旧代码。实际上,DB和ingnore还有一个开销,我应该使用
firstOrNew
。谢谢你注意到了。实际上,我的模型只能包含那些在方法中的属性,这就是为什么我使用
create
为什么
$i@usrNotFound没有数组,在这个示例中,我们只是在期望值(1到5)上循环。但是是的,这个简单的例子肯定也可以重构成foreach!(通过
Input::all()
)。不过,最好将输入值包装到另一个类中!(将
输入
调用排除在数据库逻辑之外)事务加速是什么意思?如果在一个事务中包装多个SQL语句,则数据库引擎不需要在每个语句前后锁定和解锁表。相反,它在事务之前获取锁,并在事务之后解锁。在插入顺序或相关数据时使用事务也是一种很好的做法。要么全部失败,要么全部成功。为什么
$i@usrNotFound没有数组,在本例中,我们只是在预期值(1到5)上循环。但是是的,这个简单的例子肯定也可以重构成foreach!(通过
Input::all()
)。不过,最好将输入值包装到另一个类中!(将
输入
调用排除在数据库逻辑之外)事务加速是什么意思?如果在一个事务中包装多个SQL语句,则数据库引擎不需要在每个语句前后锁定和解锁表。相反,它在事务之前获取锁,并在事务之后解锁。在插入顺序或相关数据时使用事务也是一种很好的做法。要么全部失败,要么全部成功。