Laravel 高级的 Wheres 如何将变量传递到函数中?
Laravel 高级的 Wheres 如何将变量传递到函数中?
在文档中的示例:\n
DB::table('users') ->whereExists(function($query) { $query->select(DB::raw(1)) ->from('orders') ->whereRaw('orders.user_id = users.id'); }) ->get();
\n但是如果我需要使用外部变量怎么办,就像这样:\n
->where('city_id', '=', $this->city->id) ->where(function($query) { $query->where('name', 'LIKE', '%'.$searchQuery.'%') ->orWhere('address', 'LIKE', '%'.$searchQuery.'%') })
\n目前,我创建了一个新属性并通过$this->
访问它,但是否有更方便的方法?
在使用Laravel的eloquent时,你可能会尝试以下方法。
$result = self::select('*') ->with('user') ->where('subscriptionPlan', function($query) use($activated){ $query->where('activated', '=', $roleId); }) ->get();
问题出现的原因是在上述代码中,我们想要将变量$activated传递给where子查询中的闭包函数,但是闭包函数无法直接访问外部的变量。因此,我们需要使用use关键字将$activated变量传递给闭包函数。
解决方法是在闭包函数之前使用use关键字,并将$activated变量作为参数传递给闭包函数。这样,闭包函数就可以访问和使用$activated变量了。
上述代码中的解决方法是将$activated变量传递给闭包函数,然后在闭包函数中将其作为参数使用。这样,我们就可以在where子查询中使用$activated变量了。
Laravel高级where语法中如何将变量传递给函数?
在Laravel的高级where语法中,有时候需要将变量传递给函数,以便在查询过程中使用这些变量。下面是一个示例代码:
DB::table('users')->where(function ($query) use ($activated,$var2) { $query->where('activated', '=', $activated); $query->where('var2', '>', $var2); })->get();
在上面的代码中,我们可以看到在where函数中传递了两个变量$activated和$var2。这样就可以在查询中使用这些变量来进行条件筛选。
解决方法非常简单,只需要在where函数中使用use关键字将变量传递进去即可。可以通过use($var1, $var2)
的方式传递多个变量。
通过这种方式,我们可以在Laravel的高级where语法中轻松地将变量传递给函数,实现更加灵活和动态的查询条件。
在Laravel中,如果想将父作用域中的变量传递给闭包函数,可以使用use
关键字。具体示例如下:
DB::table('users')->where(function ($query) use ($activated) { $query->where('activated', '=', $activated); })->get();
从PHP 7.4开始,引入了一种更简洁的匿名函数语法,称为箭头函数(arrow functions)。使用箭头函数可以简化代码。示例如下:
DB::table('users')->where(fn($query) => $query->where('activated', '=', $activated))->get();
与常规语法相比,箭头函数的差异如下:
- 使用fn
关键字代替function
。
- 不需要显式列出应从父作用域中捕获的所有变量 - 这由语言自动按值捕获。因此,后面的示例中没有使用use
关键字。
- 箭头函数始终返回一个值,这意味着无法在声明时使用void
返回类型。
- 必须省略return
关键字。
- 箭头函数必须只有一个表达式,即返回语句。目前不支持多行函数,但仍然可以链式调用方法。
至于将fn($query)
命名为f
的问题,目前尚不支持给箭头函数命名。