如何向Laravel的DB::transaction()方法传递参数

39

根据 Laravel 文档:数据库事务。 文档中指出:

DB::transaction(function() {
    DB::table('users')->update(array('votes' => 1));
    DB::table('posts')->delete();
});

在这里,输入1以显式更新用户...

我尝试使用一个变量来实现这一点,

$id = 3;
DB::transaction(function() {
    DB::table('users')->where('id','=',$id)->get();
});

它抛出一个错误:

Undefined variable: id

我也尝试将$id作为参数放置在代码中,像这样:

$id = 3;
DB::transaction(function($id) {
    DB::table('users')->where('id', '=', $id)->get();
});

仍然有一个错误:

无法将Illuminate\Database\MySqlConnection类的对象转换为字符串

我做错了什么吗?请指教,谢谢...

3个回答

83

use关键字是您所需的:

$id = 3;
DB::transaction(function($id) use ($id) {
    DB::table('users')->where('id', '=', $id)->get();
});

对于PHP 7(未经测试,根据下面答案的要求进行了编辑):

$id = 3;
DB::transaction(function() use ($id) {
    DB::table('users')->where('id', '=', $id)->get();
});

9
推荐讲座:匿名函数:闭包和作用域 - Rubens Mariuzzo
如果你在闭包内修改 $id,它会影响到外部的 $id 吗? - Captain Hypertext
3
不一定,如果您想更改外部的 $id,可以这样引用它:DB::transaction(function($id) use (&$id) { - S.A
@Alexandre Danault 值得编辑此答案以反映 PHP 7 中所做的更改(在下面的另一个答案中提到)。 - 1000Nettles
在PHP 7中,您不需要将$id放置在function()内部。相反,只需将其传递到use()闭包中即可。这应该足以使变量在代码块内可用。 - Dibyendu Mitra Roy

22

在 PHP 7 中,语法已经改变:

$id = 3;
DB::transaction(function () use ($id) {
    DB::table('users')->where('id', '=', $id)->get();
});

这是离合器。 - niczak
1
这是新的正确答案。我之前遇到了“无法使用词法变量$varName作为参数名”的错误,而这个答案解决了我的问题。我甚至更新了我的composer以更新guzzle,看看是否是问题所在。 - xWaZzo

2
为了回答@CaptainHypertext的问题:
如果你在闭包中改变了$id,那么它会影响到外部的$id吗?
这种方法对我很有效:
$id = 3;
$transactionResult = DB::transaction(function($id) use ($id) {
 $request_id = DB::table('requests')->insertGetId([
                          'company_id' => $company->$id,
                         ]);
return  $request_id ;
});

echo($transactionResult);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接