Laravel Advanced Wheres 如何将变量传递到函数中?

2022-08-30 07:38:00

文档中的示例:

DB::table('users')
        ->whereExists(function($query)
        {
            $query->select(DB::raw(1))
                  ->from('orders')
                  ->whereRaw('orders.user_id = users.id');
        })
        ->get();

但是,如果我需要像这样使用外部变量呢:

            ->where('city_id', '=', $this->city->id)
            ->where(function($query)
                {
                    $query->where('name', 'LIKE', '%'.$searchQuery.'%')
                    ->orWhere('address', 'LIKE', '%'.$searchQuery.'%')

                })

现在,我创建了新属性并通过 访问它,但是有没有更方便的方法?$this->


答案 1

可以使用关键字将必要的变量从父作用域传递到闭包中。use

例如:

DB::table('users')->where(function ($query) use ($activated) {
    $query->where('activated', '=', $activated);
})->get();

更多关于这里

编辑(2019年更新):

PHP 7.4(将于 2019 年 11 月 28 日发布)引入了匿名函数的较短变体,称为箭头函数,这使得它不那么冗长。

使用 PHP 7.4 的示例,它在功能上几乎等效(请参阅下面的第 3 个项目符号点):

DB::table('users')->where(fn($query) => $query->where('activated', '=', $activated))->get();

与常规语法相比的差异:

  • fn关键字,而不是 .function
  • 无需显式列出应从父作用域捕获的所有变量 - 现在按值自动完成此操作。请参阅后一个示例中缺少关键字的情况。use
  • 箭头函数始终返回一个值。这也意味着在声明它们时不可能使用返回类型。void
  • 必须省略关键字。return
  • 箭头函数必须具有单个表达式,即 return 语句。目前不支持多行函数。不过,您仍然可以链接方法。

答案 2

@kajetons的答案是完全有效的。

您还可以通过传递多个变量来传递它们,如下所示:use($var1, $var2)

DB::table('users')->where(function ($query) use ($activated,$var2) {
    $query->where('activated', '=', $activated);
    $query->where('var2', '>', $var2);
})->get();

推荐