Laravel 将附加参数传递给函数

Posted

技术标签:

【中文标题】Laravel 将附加参数传递给函数【英文标题】:Laravel where has passing additional arguments to function 【发布时间】:2016-04-26 01:46:51 【问题描述】:

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

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)传递到闭包(这称为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)  /* ... */ );

【讨论】:

我知道这很简单。谢谢 嘿@rdiz,如何使用when() 传递多个参数,或者我们必须在laravel 中为两个参数写when() 2 次?【参考方案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;

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

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

【讨论】:

以上是关于Laravel 将附加参数传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将附加参数传递给自定义 python 排序函数

Python最小化函数:将附加参数传递给约束字典

如何在 PHP 中将单个附加参数传递给 array_map 回调?

将附加参数传递给 React Ant Design Select 组件的 onSelect 方法

axios 将参数传递给 laravel 路由

axios将参数传递给laravel路径