【问题标题】:Laravel - Get variable from a DB Transaction ClosureLaravel - 从数据库事务关闭中获取变量
【发布时间】:2015-09-12 14:27:42
【问题描述】:

我正在使用 Laravel 5 LAMP 堆栈,并且正在尝试使用数据库事务处理 CSV 导入。代码如下所示:

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

最后,我的记录被导入,但我的 $total 和 $results 仍然是空的,因为它们超出了关闭的范围。我知道它们在函数内部被改变了,因为我已经通过它,看到它们发生了变化。我只是不知道如何让他们退出该交易并将它们归还给用户。有人可以帮忙吗?

【问题讨论】:

    标签: php laravel transactions closures


    【解决方案1】:

    您可以替换以下行:

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

    用这个:

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

    所以函数内部所做的更改将反映在变量中,因为& 创建了变量的引用(传递变量引用)而不是按值传递它们。检查Passing by Reference手册。

    或者,您可以从闭包内部返回变量,例如:

    $array = DB::transaction(function() use($csv_file, $results, $total) {
    
        // Some Code ...
    
        $total++;
        $results[] = 'Row 10 has some weird data...';
        return compact('total', 'results');
    });
    

    然后像这样使用它:

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

    【讨论】:

    • 太棒了。我什至不知道,但现在效果很好,谢谢!
    • 感谢您展示通过引用传递的正确示例
    • 我认为现在通常避免通过引用传递,所以也许第二种选择是最好的
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2018-07-15
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多