简化 Laravel 更新多行的 updateOrCreate 方法
Simplifying Laravel's updateOrCreate method for updating multiple rows
我正在使用 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
是我的模型 class,它有一个数据库 table 映射到它。
方法 firstOrCreate
将创建该模型的新对象或从数据库中为您提供该模型的现有对象。
更新:(你的情况)
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));
}
像这样。
您始终可以将其包装在 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")]);
}
});
我正在使用 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
是我的模型 class,它有一个数据库 table 映射到它。
方法 firstOrCreate
将创建该模型的新对象或从数据库中为您提供该模型的现有对象。
更新:(你的情况)
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));
}
像这样。
您始终可以将其包装在 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")]);
}
});