【问题标题】:Laravel Advanced Wheres how to pass variable into function?Laravel Advanced Wheres 如何将变量传递给函数?
【发布时间】:2015-06-15 09:13: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->访问它,但是有没有更方便的方法?

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

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

    例如:

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

    更多关于 here.

    编辑(2019 年更新):

    PHP 7.4(将在 November 28, 2019 发布)引入了称为 arrow functions 的匿名函数的较短变体,这使得它不那么冗长。

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

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

    与常规语法的区别:

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

    【讨论】:

    • 我们可以给 fn($query) 命名吗?比如如果从表中选择from user as u,我想给名字fn($query) as f
    【解决方案2】:

    如果你使用 Laravel eloquent,你也可以试试这个。

    $result = self::select('*')
                        ->with('user')
                        ->where('subscriptionPlan', function($query) use($activated){
                            $query->where('activated', '=', $roleId);
                        })
                        ->get();
    

    【讨论】:

      【解决方案3】:

      @kajetons 的回答功能齐全。

      您还可以通过像这样传递多个变量来传递它们:use($var1, $var2)

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

      【讨论】:

        【解决方案4】:

        你可以使用这个来传递变量...

        $status =1;
         $info = JOBS::where(function($query) use ($status){        
                 $query->where('status',$status);
                 })->get();
        print_r($info);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-28
          • 1970-01-01
          • 1970-01-01
          • 2020-01-11
          • 2018-07-01
          • 2020-12-20
          相关资源
          最近更新 更多