web-dev-qa-db-ja.com

Laravel whereは関数に追加の引数を渡します

次の結果は明らかに未定義の変数になります。

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にアクセスできるようにするにはどうすればよいですか?今、これはおそらく簡単なものですが、検索する必要があるものを見つけることができません。

14
Philwn

変数を渡すには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) { /* ... */ });
57
Dencker

親スコープから変数を継承する必要があります。

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

4
Giedrius