发送多个变量到laravel Api资源

时间:2018-09-10 09:29:16

标签: laravel api eloquent resources

我想要不同类型的收藏集。一个包含用户的城市在城市附近,另一个包含用户附近的城市。我想从单个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": "??",

            }
        ],

    }
}

2 个答案:

答案 0 :(得分:2)

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

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

编辑:评论后

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

在控制器ex中创建这些操作。 (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)

答案 1 :(得分:2)

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

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

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

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