2015-06-25 15 views
5

Tôi đang làm việc với một ngăn xếp Laravel 5 LAMP, và tôi đang cố gắng xử lý một nhập CSV với một giao dịch cơ sở dữ liệu. Mã trông giống như sau:Laravel - Nhận biến từ một giao dịch DB đóng cửa

// 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); 

Khi kết thúc, hồ sơ của tôi được nhập nhưng tổng $ của tôi và $ kết quả vẫn trống vì chúng nằm ngoài phạm vi đóng. Tôi biết họ đang bị thay đổi bên trong chức năng, bởi vì tôi đã bước qua nó, và thấy họ thay đổi. Tôi chỉ không thể tìm ra cách để đưa chúng ra khỏi giao dịch đó và trả lại cho người dùng. Bất cứ ai có thể vui lòng giúp đỡ với điều này?

Trả lời

15

Bạn có thể thay thế các dòng sau:

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

với điều này:

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

Vì vậy, các thay đổi được thực bên trong hàm sẽ phản ánh trong các biến vì & tạo ra một tài liệu tham khảo của biến (Passes tham chiếu biến) thay vì truyền chúng theo giá trị. Kiểm tra hướng dẫn sử dụng Passing by Reference.

Ngoài ra, bạn có thể trở lại các biến từ bên trong đóng cửa như:

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

    // Some Code ... 

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

Sau đó sử dụng nó như:

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

Đó là tuyệt vời. Tôi thậm chí không biết về điều đó, nhưng bây giờ nó hoạt động tốt, cảm ơn! –

+1

Cảm ơn bạn đã hiển thị một ví dụ phù hợp để chuyển qua tham chiếu – Shay

+0

Bạn được chào đón @Shay :-) –

Các vấn đề liên quan