以下显然会导致未定义的变量。
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? 现在这可能很简单但我无法找到我需要搜索的内容。
答案 0 :(得分:51)
您必须使用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) { /* ... */ });
答案 1 :(得分: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;
}
闭包还可以从父作用域继承变量。必须将任何此类变量传递给使用语言构造。