【问题标题】:Laravel Eloquent with not identifying variablesLaravel Eloquent 不识别变量
【发布时间】:2015-03-03 04:51:14
【问题描述】:

我正在尝试使用 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');

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

【问题讨论】:

    标签: php closures


    【解决方案1】:

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

    闭包也可以从父作用域继承变量。任何此类变量都必须传递给使用语言构造。

    您正试图从匿名函数内的父作用域访问变量,因此您必须首先将其传递给 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”),至少在语法方面。但是,文档中并未明确说明这一点(手册似乎将两者等同起来,但实际上它们并不相同)。

    【讨论】:

      【解决方案2】:

      变量范围:

          $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();
      

      【讨论】:

        【解决方案3】:

        像这样放分号:

        $fdate='2015-01-05';
        

        【讨论】:

        • 我很抱歉我在复制我的代码时错过了它
        猜你喜欢
        • 2017-03-05
        • 1970-01-01
        • 2022-11-02
        • 2021-02-16
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多