2017-12-14 7 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()); 
    } 

Ich arbeitete an einer Aufgabe, um ein gemeinsames Merkmal zu erstellen, um zu verhindern, dass ein Datensatz von mehreren Benutzern gleichzeitig aktualisiert wird. Und meine Methode bestand darin, die versteckte Eingabe von $ data-> updated_at in einem Blade zu speichern und sie dann zu überprüfen, wenn eine Update-Anfrage gesendet wurde. Und es gibt Fälle, in denen Laravel updateOrCreate zum Aktualisieren oder Erstellen eines neuen Datensatzes verwendet wird. Und ich weiß nicht, wie ich damit umgehen soll. Sollte ich die Methoden zum Erstellen und Aktualisieren teilen oder gibt es einen guten Weg, damit umzugehen?Laravel 5.3 Eloquent updateOrCreate

+0

welche Rolle Sie Probleme verursacht? – lagbox

+0

das Problem ist, dass ich nicht überprüfen kann, aktuelles Datum aktualisiert mit updateOrCreate bestehenden Datensatz, weil es nur einen neuen Datensatz erstellt, wenn es keine Übereinstimmung in db gibt. Da im Projekt mehrere updateOrCreate-Methoden vorhanden waren, wollte ich wissen, ob es möglich ist, die Methode beizubehalten und zu verhindern, dass die vorhandenen Daten gleichzeitig von mehreren Benutzern aktualisiert werden. Sorry, meine Frage war nicht ganz klar, ich denke – Jasurbek

+0

Sie sollten das Update aufteilen und in zwei separate Endpunkte erstellen Dann überprüfen Sie, wenn es ein Update gibt, und wenn ja, aktualisieren Sie es. –

Antwort

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

Sie möchten wahrscheinlich trennen, was Sie tun.

Ich spielte herum und kam für Spaß mit diesem nach oben (nicht getestet):

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

danke für deine zeit und code. Ich habe die Aufgabe abgeschlossen, indem ich update und create getrennt habe. BTW, Ist es möglich, Makro-Funktion auf Laravel 5.3 zu verwenden? – Jasurbek

+0

Seltsamerweise hat der Eloquent Builder in 5.3 eine "Makro" -Methode, aber es ist nicht statisch, also funktioniert das nicht so ... das wurde in neueren Versionen angepasst ... ich empfehle dringend, auf 5.5 LTS zu aktualisieren wenn du kannst, aus vielen anderen Gründen – lagbox

Verwandte Themen