Laravel where 已将其他参数传递给函数

2022-08-30 18:43:44

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

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?现在这可能很简单,但我找不到我需要搜索的内容。


答案 1

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

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) { /* ... */ });

答案 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;
}

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

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


推荐