Laravel Eloquent没有识别变量

Tyr*_*gel 3 php closures

我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)

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

$query->where('bookstart','>','2015-01-05');
Run Code Online (Sandbox Code Playgroud)

这非常有效.这有什么原因吗?有人能为这个问题提供一个好的解决方案吗?

Jef*_*ert 5

你正在回调中使用一个闭包with.首先,来自该doc页面的引用:

闭包还可以从父作用域继承变量.必须将任何此类变量传递给use语言构造.

您正在尝试从匿名函数内的父作用域访问变量,因此必须首先将其传递给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);
    }))
;
Run Code Online (Sandbox Code Playgroud)

将此与Javascript进行对比,Javascript允许程序员自动访问父作用域,因为每个子作用域都是父作用域的作用域链的一部分.这样的东西在Javascript中是有效的:

var foo = 'bar';
(function() {
    alert(foo);
})();
Run Code Online (Sandbox Code Playgroud)

在PHP中,从内部函数中获取外部变量不是自动的.通过这种方式,PHP 以一种JavaScript不具备的方式区分闭包匿名函数(也称为"lambdas"),至少在语法方面.但是,文档中没有明确说明(手册似乎等同于两者,当它们真的不一样时).