2017-12-14 12 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"옵션을 사용할 수 있지만 해당 쿼리의 구조가 db 특정 db : – 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;'배열에 여섯 번째 요소가 있다면 어떻게됩니까? – usrNotFound

+1

@usrNotFound 배열이 없습니다.이 예제에서는 우리는 예상 값 (1 ~ 5)을 루핑하는 것뿐입니다. 그러나 예,이 간단한 예제는 foreach에도 확실히 리팩토링 될 수 있습니다! ('Input :: all()'을 통해). 하지만 다른 클래스에서 입력 값을 래핑하는 것이 더 좋습니다! (데이터베이스 로직에서'Input' 호출을 유지하기 위해) –

1

이것은 이미 존재하는지 확인하여 여러 레코드를 만드는 방법입니다. (당신의 속성을 당신의 모델에 채워 넣고 위의 코드를 Loop에 넣으십시오).
그냥 예제 코드 :

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

인 경우 해당 쿼리를 직접 작성하고 해당 db에 잠글 것입니다 왜 'firstOrNew'가 아니라'create '케이스에 여분의 쿼리를 저장합니까? 'updateOrCreate'가'firstOrNew'를 호출합니다 – lagbox

+1

맞습니다'firstOrNew'는 제 경우에'firstOrCreate'보다 낫지 만 이것은 Laravel을 배웠을 때 작성한 오래된 코드였습니다. 실제로 DB를위한 또 하나의 오버 헤드가 있으며'firstOrNew'를 사용해야한다고 생각합니다. 고마워. 사실 내 모델은 그 안에있는 속성들만 가질 수 있습니다. 왜'create'를 사용했는지 – webDev