【问题标题】:Send multiple variable to laravel Api resources将多个变量发送到 laravel Api 资源
【发布时间】:2019-02-14 17:02:20
【问题描述】:

我想要不同类型的集合..一个包含整个城市的用户,另一个包含附近的用户。我想要这些来自单个 api 命中。可能吗 ?如果是,请建议如何做到这一点。

我做了什么

return  ServiceProviderCollection::collection($near_by);

输出:

"data": [
    {
        "username": "??",
        "email": "??",
        "rating": 0,
        "role_id": 2,
        "wallet": "0"
    }
],

我想要

return  ServiceProviderCollection::collection($near_by,$across_city);

预期输出:

{
    "across_city": {
        "data": [
            {
                "username": "??",
                "email": "??",
            }
        ],
    },
    "near_by": {
        "data": [
            {
                "username": "??",
                "email": "??",

            }
        ],

    }
}

【问题讨论】:

  • ServiceProviderCollection 类到底是什么?这似乎不是 Laravel 本身的一部分。
  • Laravel 的资源集合。集合资源扩展了 Illuminate\Http\Resources\Json\ResourceCollection 类。更多详情:laravel.com/docs/5.7/eloquent-resources

标签: laravel api eloquent resources


【解决方案1】:

我目前正在使用 Laravel 7,并且在我的控制器中我将一组集合对象传递给资源类

 $data = ['quotation' => Quotation::first()]; 
 return new QuotationResource($data);

在我的资源类中,我可以使用

   public function toArray($request)
   {
        return [
            'quotation' => $this->resource['quotation']
        ];
    }

【讨论】:

    【解决方案2】:

    不,您不能在 Resource 中传递 2 个对象。你可以这样做

    return [
             'across_city' =>  ServiceProviderCollection::collection($across_city),
             'near_by' => ServiceProviderCollection::collection($near_by)
           ];
    

    编辑:评论后

    如果要显示分页信息,则必须创建单独的控制器操作,然后返回ServiceProviderCollection::collection,然后您将获得带有分页元信息的结果。

    在你的控制器中创建这些动作。 (UserController)

    public function acrossCity(){
       $acrossCity = User::where('city','test')->paginate(10); //example 
    
       return ServiceProviderCollection::collection($acrossCity);
    }
    
    public function nearBy(){
       $nearBy = User::where('near','1')->paginate(10); //example 
    
       return ServiceProviderCollection::collection($nearBy);
    }
    

    为这些创建路线

    Route::get('user/acrossCity','UserController@acrossCity');
    Route::get('user/nearBy','UserController@nearBy');
    

    查看文档https://laravel.com/docs/5.6/eloquent-resources#pagination

    注意:使用资源类时,请不要将其命名为Collection。对于您的情况,您应该将资源命名为 ServiceProviderResource,然后在调用其集合时命名为 ServiceProviderResource::collection($object),但在返回单个对象时命名为 new ServiceProviderResource($object)

    【讨论】:

    • ServiceProviderCollection::collection($across_city)//分页工作。但是当我使用你上面的代码分页工作但没有显示任何元值,如当前页面、下一页链接等时。
    • @weaver 如果要显示分页信息,则必须创建单独的控制器操作,然后 return ServiceProviderCollection::collection 然后您将获得带有分页元信息的结果
    • @rkj..谢谢..我正在尝试这样做..但是我对如何做到这一点一无所知。请您详细解释一下吗?
    • 您使用了两条不同的路线。意味着我不能同时获得结果 near_by 和 cross_city 。我需要单条路线命中的两个结果
    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2017-03-10
    • 2017-04-26
    • 2023-03-11
    • 2021-08-19
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多