2015-06-25 11 views
5

Sto lavorando con uno stack LAMP di Laravel 5 e sto tentando di elaborare un'importazione CSV con una transazione di database. Codice assomiglia a questo:Laravel - Ottieni variabile da una chiusura transazione DB

// Should contain any messages to pass back to the user 
$results = []; 

// Contains the total records inserted 
$total = 0; 

DB::transaction(function() use($csv_file, $results, $total) { 

    // Some Code ... 

    $total++; 
    $results[] = 'Row 10 has some weird data...'; 
}); 

return view('plan.import') 
    ->with('results', $results) 
    ->with('total', $total); 

Alla fine di questo, i miei dischi sono importati, ma il mio $ totale e $ risultati sono ancora vuoto, dal momento che sono al di fuori del campo di applicazione della chiusura. So che sono stati alterati all'interno della funzione, perché l'ho attraversata e li ho visti cambiare. Non riesco a capire come ottenerli da quella transazione e restituirli all'utente. Qualcuno può aiutare con questo?

risposta

15

È possibile sostituire la seguente riga:

DB::transaction(function() use($csv_file, $results, $total) 

con questo:

DB::transaction(function() use($csv_file, &$results, &$total) 

Così le modifiche apportate all'interno della funzione rifletterà nelle variabili perché & crea un riferimento della variabile (pass la variabile di riferimento) invece di passarli per valore. Controllare il manuale Passing by Reference.

In alternativa, è possibile restituire le variabili dall'interno della chiusura come:

$array = DB::transaction(function() use($csv_file, $results, $total) { 

    // Some Code ... 

    $total++; 
    $results[] = 'Row 10 has some weird data...'; 
    return compact('total', 'results'); 
}); 

quindi utilizzarlo come:

return view('plan.import') 
->with('results', $array['results']) 
->with('total', $array['total']); 
+1

Questo è impressionante. Non lo sapevo nemmeno, ma adesso funziona alla grande, grazie! –

+1

Grazie per aver mostrato un esempio corretto di passaggio per riferimento – Shay

+0

Siete i benvenuti @Shay :-) –