2016-04-12 1 views
0

Ich lerne Laravel, arbeiten am 5.22. Ich versuche, zwei Datensätze in zwei Tabellen zu speichern, aber die Änderungen nur zu bestätigen, wenn beide Seiten Erfolg haben, sonst möchte ich, dass es fehlschlägt und Rollback.Laravel 5.2 führen mehrere db-Transaktionen dann Commit oder Rollback, wenn fehlgeschlagen

Mein Controller-Code für das Speichern ist:

public function store(Request $request) 
{ 
    $all = $request->all(); 

    // we need to fill in who is the creator of this new user, 
    $all['creator_user_id'] = Auth::user()->id; 

    // Commit both updates or fail and rollback 
    DB::transaction(function ($all) { 
     $client = Client::create($all); 
     $orgClient['organisation_id'] = $client->organisation_id; 
     $orgClient['client_id'] = $client->client_id; 
     OrganisationClient::create($orgClient); 
    }); 

    return redirect() 
     ->route('client.index') 
     ->withMessage([ 
      'type' => 'success', 
      'value' => 'Client <strong>' . $all->client_name . '</strong> successfully created.']); 

} 

Dieser schlägt mit dem Fehler:

Type error: Argument 1 passed to Illuminate\Database\Eloquent\Model::create() must be of the type array, object given, called in /home/vagrant/Code/simply-invoice/app/Http/Controllers/ClientController.php on line 80 

scheint Mein Problem $all zur Schließung zu übergeben. Wenn ich $all aus dem Abschluss-Parameter entferne, bekomme ich undefined variable all. Wie mache ich das? Vielen Dank!

Antwort

2

Sie setzen $all als Callback-Parameter anstelle von use. Der Callback transaction empfängt momentan eine Instanz von Illuminate\Database\Connection als Parameter.

Um die tatsächliche Variable, die Sie Sie Ihren Rückruf sich ändern müssen, um diese zu erhalten möchten:

// .... 
DB::transaction(function() use($all) { 
// ... 
+0

Dank @Roj Vroemen, lernen eine andere für heute! – TheRealPapa