2017-12-14 8 views
0
try { 
    \DB::beginTransaction(); 
     Model::updateOrCreate(['id' => $id, 'number' => $number], 
      ['value' => $request->get('value')] 
    ); 
      \DB::commit(); 
    } catch (\Exception $e) { 
      \DB::rollBack(); 
      throw new \Exception($e->error()); 
    } 

나는 동시에 여러 사용자가 레코드를 업데이트하지 못하도록 공통된 특성을 만드는 작업을하고있었습니다. 그리고, 내 방법은 $ data-> updated_at의 숨겨진 입력을 블레이드에 넣은 다음 업데이트 요청이 전송 될 때이를 확인하는 것이 었습니다. Laravel의 updateOrCreate는 새 레코드를 업데이트하거나 만드는 데 사용됩니다. 그리고, 어떻게 대처해야할지 모르겠습니다. 내가 작성하고 업데이트 할 메소드를 분할해야합니까, 아니면이를 처리 할 좋은 방법이 있습니까?Laravel 5.3 아주 가벼운 updateOrCreate

+0

당신에게 문제가 어떤 부분을 일으키는? – lagbox

+0

문제는 db에 일치 항목이없는 경우 새 레코드를 만들기 때문에 updateOrCreate를 사용하여 기존 레코드 업데이트 날짜를 확인할 수 없다는 것입니다. 프로젝트에 여러 updateOrCreate 메소드가 있었으므로 메소드를 유지하고 기존 데이터가 동시에 여러 사용자가 업데이트하지 못하도록하고 싶었습니다. 죄송합니다, 제 질문은 확실하지 않습니다. 내 생각 엔 정확하지 않습니다. – Jasurbek

+0

업데이트를 분리하여 두 개의 개별 종단점으로 생성해야합니다. 업데이트를 수행 할 때 업데이트가 존재하는지 확인한 다음 업데이트가 있으면 업데이트하십시오. –

답변

0
$post = Model::where([['id', $id], ['number', $number]])->first(); 
    try { 
     \DB::beginTransaction(); 
     if (is_null($post)) { 
      Model::create($input); 
     } else { 
      $post->updateWithExclLock($request->get('updated_at'), $input]); 
     } 
0

아마도 당신이하는 일을 분리하고 싶을 것입니다.

나는 (테스트하지 않았습니다) 주위 재생 재미이 함께했다되었습니다

Illuminate\Database\Eloquent\Builder::macro('createOrUpdateWhen', function ($attributes = [], $values = [], $when = null) { 
    $m = $this->firstOrNew($attributes); 

    if (is_array($when)) { 
     $when = function ($m) use ($when) { 
      foreach ($when as $key => $value) { 
       if ($m->$key != $value) { 
        return false; 
       } 
      } 

      return true; 
     } 
    } 

    if (! $m->exists || $when($m)) { 
     $m->fill($values); 
    } 

    $m->save(); 

    return $m; 
}); 

$m = M::createOrUpdateWhen($attributes, $values, function ($m) use ($request) { 
    return $m->updated_at == $request->input('updated_at'); 
}); 

$m = M::createOrUpdateWhen(
    $attributes, $values, ['updated_at' => $request->input('updated_at')] 
); 

:-}

+0

시간과 코드에 감사드립니다. 나는 update와 create를 분리하여 작업을 완료했다. btw, Laravel 5.3에서 매크로 기능을 사용할 수 있습니까? – Jasurbek

+0

이상하게도 Eloquent Builder는 5.3에서'macro' 메소드를 가지고 있지만, 이렇게 정적이 아닙니다. 그래서이 방법으로 작동하지 않을 것입니다 ... 이것은 새로운 버전에서 조정되었습니다 ... 5.5 LTS로 업그레이드하는 것이 좋습니다. 가능하면 여러 가지 다른 이유로 – lagbox