【问题标题】:Additional data in Laravel ResourceLaravel 资源中的附加数据
【发布时间】:2019-12-21 18:07:23
【问题描述】:

我使用来自控制器的 Laravel 资源:

        $data = Project::limit(100)->get();

        return response()->json(ProjectResource::collection($data));

我喜欢将其他信息传递给 ProjectResource。怎么可能?以及如何访问其他数据?

我试过这样:

        $data = Project::limit(100)->get();

        return response()->json(ProjectResource::collection($data)->additional(['some_id => 1']);

但它不起作用。

什么是正确的方法?

我喜欢像这样访问资源中的some_id

    public function toArray($request)
    {

        return [
            'user_id'                =>      $this->id,
            'full_name'              =>      $this->full_name,
            'project_id'             =>      $this->additional->some_id

        ];
    }

【问题讨论】:

    标签: laravel


    【解决方案1】:

    在您的控制器中,不要将返回资源包装在 response()->json 中。 只需返回 ProjectResource。

    比如:

    $data = Project::limit(100)->get();
    return ProjectResource::collection($data)->additional(['some_id => 1']);
    

    对不起,误解了这个问题。 我认为没有这样的选项可以传递额外的数据。所以你必须循环遍历集合并以某种方式添加它。

    一种选择是添加到 AnonymousCollection 中的资源。例如:

    $projectResource = ProjectResource::collection($data);
    $projectResource->map(function($i) { $i->some_id = 1; });
    return $projectResource;
    

    然后在 ProjectResource 中:

    return [
      'user_id' => $this->id,
      'full_name' => $this->full_name,
      'project_id' => $this->when( property_exists($this,'some_id'), function() { return $this->some_id; } ), 
    ];
    

    或者在传递给 ResourceCollection 之前将 some_id 添加到项目集合中。

    【讨论】:

    • 如何将这些附加数据提供给资源,因为它是在集合上设置的?
    • laravel.com/docs/master/eloquent-resources#adding-meta-data 检查“在构造资源时添加元数据”在返回的 json 中,主集合将作为“数据”使用,而 some_id 将作为 ->some_id 使用
    • 在集合上,而不是单个资源上,他们的 toArray 方法在资源而不是集合上...我试图找到最终会在每个集合上调用 toArray 的集合资源会将这些额外的数据传递给它
    • 我找到了解决方案:我将 id 作为会话变量传递给 ProjectResource。这不是我认为最好的方式,但它确实有效。
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2020-11-27
    • 2014-10-08
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多