2017-12-14 26 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

問題は、既存のレコードの更新日をupdateOrCreateでチェックすることができないことです。これは、dbに一致するレコードがない場合にのみ新しいレコードを作成するためです。プロジェクトには複数のupdateOrCreateメソッドがありましたので、メソッドを保持して既存のデータを複数のユーザーが同時に更新できないようにすることができたかどうかを知りたかったのです。申し訳ございませんが、私の質問はあまり明確ではありませんでした – Jasurbek

+0

更新を分割して2つの別々のエンドポイントに作成する必要があります 更新を行う際には、存在するかどうかを確認してください。 –

答えて

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

関連する問題