次の結果は明らかに未定義の変数になります。
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にアクセスできるようにするにはどうすればよいですか?今、これはおそらく簡単なものですが、検索する必要があるものを見つけることができません。
変数を渡すには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) { /* ... */ });
親スコープから変数を継承する必要があります。
public function show($locale, $slug) {
$article = Article::whereHas('translations', function ($query, $slug) use ($slug){
$query->where('locale', 'en')
->where('slug', $slug);
})->first();
return $article;
}
クロージャーは、親スコープから変数を継承する場合もあります。このような変数はすべて、言語使用構造体に渡す必要があります。