Laravel Eloquent 没有识别变量

Laravel Eloquent with not identifying variables

我正在尝试使用 laravel-eloquent 获取特定日期之后的房间和他们的预订。

$fdate='2015-01-05';
$roomdata=Rooms::where('city_id','=',$citydata['id'])
->with('types')
->with('localities')
->with('slideshow')
->with(array('booking' => function($query){
    $query->where('bookstart','>',$fdate);
}))
->get();

这给我一个错误,说 $fdate 未定义。但是当我这样做时

$query->where('bookstart','>','2015-01-05');

效果很好。这背后有什么原因吗?有人可以为这个问题提供一个好的解决方案吗?

像这样输入分号:

$fdate='2015-01-05';

您正在 with 的回调中使用 closure。首先,引自该文档页面:

Closures may also inherit variables from the parent scope. Any such variables must be passed to the use language construct.

您正试图从匿名函数内的父作用域访问变量,因此您必须首先将其传递给 use 构造,以便让 PHP 知道您正在创建闭包围绕该变量:

$roomdata = Rooms::where('city_id','=',$citydata['id'])
    ->with('types')
    ->with('localities')
    ->with('slideshow')
    ->with(array('booking' => function($query) use($fdate) {
        $query->where('bookstart','>',$fdate);
    }))
;

将此与 Javascript 进行对比,后者允许程序员自动访问父作用域,因为每个子作用域都是父作用域的一部分 Scope Chain。这样的事情在 Javascript:

中有效
var foo = 'bar';
(function() {
    alert(foo);
})();

在PHP中,从内部函数中获取对外部变量的访问不是自动的。通过这种方式,PHP 以 JavaScript 不具备的方式区分 closures and anonymous functions(又名 'lambdas'),至少在语法方面是这样。然而,这在文档中没有明确说明(手册似乎将两者等同起来,但实际上它们并不相同)。

可变范围:

    $fdate='2015-01-05';
    $roomdata=Rooms::where('city_id','=',$citydata['id'])
    ->with('types')
    ->with('localities')
    ->with('slideshow')
    ->with(array('booking' => function($query) use ($fdate){
        $query->where('bookstart','>',$fdate);
    }))
    ->get();