Laravel中的whereHas如何向函数传递额外参数

22

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

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

2个回答

76

您需要使用 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) { /* ... */ });

我知道这一定是某些简单的东西。谢谢。 - Philwn
嘿@rdiz,如何在Laravel中使用when()传递多个参数?还是我们需要为两个参数分别编写when() - Gomzy

4
您需要从父级作用域继承变量:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接