【问题标题】:Laravel where has passing additional arguments to functionLaravel 将附加参数传递给函数
【发布时间】:2016-04-26 01:46:51
【问题描述】:

以下显然会导致未定义的变量。

public function show($locale, $slug)
{
 $article = Article::whereHas('translations', function ($query) {
 $query->where('locale', 'en')
  ->where('slug', $slug);
 })->first();

   return $article;
}

尝试为函数提供 $slug 变量:

public function show($locale, $slug)
{
    $article = Article::whereHas('translations', function ($query, $slug) {
        $query->where('locale', 'en')
        ->where('slug', $slug);
    })->first();

    return $article;
}

结果

Missing argument 2 for App\Http\Controllers\ArticlesController::App\Http\Controllers\{closure}()

如何让函数访问 $slug? 现在这可能很简单,但我找不到我需要搜索的内容。

【问题讨论】:

    标签: php laravel arguments closures


    【解决方案1】:

    您必须使用use 将变量(在您的情况下为$slug)传递到闭包(这称为variable inheriting):

    public function show($locale, $slug)
    {
          $article = Article::whereHas('translations', function ($query) use ($slug) {
            $query->where('locale', 'en') //                             ^^^ HERE
                  ->where('slug', $slug);
        })->first();
    
        return $article;
    }
    

    如果您以后想将$locale 与它一起传递,只需用逗号分隔即可:

    Article::whereHas('translations', function ($query) use ($slug, $locale) { /* ... */ });
    

    【讨论】:

    • 我知道这很简单。谢谢
    • 嘿@rdiz,如何使用when() 传递多个参数,或者我们必须在laravel 中为两个参数写when() 2 次?
    【解决方案2】:

    你需要从父作用域继承变量:

    public function show($locale, $slug) {
    
        $article = Article::whereHas('translations', function ($query, $slug) use ($slug){
            $query->where('locale', 'en')
            ->where('slug', $slug);
        })->first();
    
        return $article;
    }
    

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

    从这里:http://php.net/manual/en/functions.anonymous.php

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2013-06-03
      • 2011-12-21
      • 2013-01-09
      • 1970-01-01
      相关资源
      最近更新 更多