Php 简化Laravel';s updateOrCreate方法用于更新多行
我正在使用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
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语句,则数据库引擎不需要在每个语句前后锁定和解锁表。相反,它在事务之前获取锁,并在事务之后解锁。在插入顺序或相关数据时使用事务也是一种很好的做法。要么全部失败,要么全部成功。