【问题标题】:Laravel nova action - get current model instance on fields()Laravel nova 动作 - 在 fields() 上获取当前模型实例
【发布时间】:2019-11-15 06:01:00
【问题描述】:

Laravel 5.8 新星 2.0

在新星行动中

public function fields()
{
    return [];
}

有什么方法可以在此处访问当前选定的行吗?

【问题讨论】:

    标签: laravel laravel-nova


    【解决方案1】:

    不,有两个原因:

    1) fields 在资源加载时调用,而不是在显示操作对话框时调用

    2)“当前选中”的概念真的只存在于客户端(浏览器)端

    您只能在handle PHP 方法中访问选定的行(即提交后,您有$models)。

    【讨论】:

    • 加载资源时,资源属于模型,正确,我希望在字段中。如果此时模型不可用,我们如何显示资源?
    • Nova 操作不绑定到特定模型实例(或一组模型),而是绑定到资源定义。这有意义吗?
    • 有没有办法从特定资源中获取相应的模型?
    • 仅在“handle”方法中
    • 在我看来,这是 Nova 的一个“设计缺陷”,因为是的,我们理解它的原因,但动作是最强大的功能之一,缺乏这种能力会扼杀可能性。
    【解决方案2】:

    有时,当我在详细信息视图中并想要对该记录执行操作时,还想要字段中的当前记录数据(可能是帮助文本),我从 URL 中获取它。

    //Get the URL
        $explodeUrl = explode('/', strrev($_SERVER['HTTP_REFERER']), 2);
    

    【讨论】:

      【解决方案3】:

      您可以从 NovaRequest 获取当前模型实例。您可以从传递给方法的 \Illuminate\Http\Request 创建 NovaRequest:

      use Laravel\Nova\Http\Requests\NovaRequest;
      use Illuminate\Http\Request;
      
      /**
       * Get the fields displayed by the resource.
       *
       * @param  \Illuminate\Http\Request  $request
       * @return array
       */
      public function fields(Request $request)
      {
         // Model instance or null
         $model = NovaRequest::createFrom($request)
            ->findModelQuery()
            ->first();
      
         return [
           // Your fields here
         ];
      }
      

      【讨论】:

      • 似乎有道理,如果您对此答案添加一些参考,将会有所帮助。
      【解决方案4】:

      我只在详细信息页面上运行该操作,然后像这样获取单个模型数据:

      $model = DB::table('something')->where('id', request()->resourceId)->first();
      

      【讨论】:

      • 如果它可以工作,你可以做 Model::find(request()->resourceId) 。现在还没有 Nova,所以无法确认。
      猜你喜欢
      • 2021-01-10
      • 2023-03-26
      • 2020-05-03
      • 2017-01-23
      • 2013-07-09
      • 1970-01-01
      • 2019-03-25
      • 2012-11-24
      • 2019-09-15
      相关资源
      最近更新 更多