Отправить несколько переменных в ресурсы api laravel

Я хочу другой тип коллекции. Одна содержит пользователей в городе, а другая - рядом с пользователями. Я хочу их от одного хита 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.

Jerodev 10.09.2018 11:33

Коллекция ресурсов Laravel. Ресурсы коллекции расширяют класс Illuminate \ Http \ Resources \ Json \ ResourceCollection. Другие подробности: laravel.com/docs/5.7/eloquent-resources

weaver 10.09.2018 11:37
1
2
1 086
2

Ответы 2

Нет, вы не можете передать 2 объекта в Resource. Вы можете сделать это так

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).

ServiceProviderCollection :: collection ($ through_city) // страница работает. Но когда я использую указанный выше код, разбиение на страницы работает, но не показывает никаких мета-значений, таких как текущая страница, ссылка на следующую страницу и т. д.

weaver 10.09.2018 14:59

@weaver Если вы хотите показать информацию о разбиении на страницы, вам нужно создать отдельное действие контроллера, а затем return ServiceProviderCollection::collection, тогда вы получите результат с метаинформацией разбивки на страницы

rkj 11.09.2018 05:48

@ rkj..Спасибо .. Я пытаюсь это сделать .. Бути не имеет ни малейшего представления, как это сделать. Не могли бы вы объяснить поподробнее?

weaver 11.09.2018 07:33

Вы использовали два разных маршрута. означает, что я не могу получить оба результата near_by и through_city одновременно. Мне нужны оба результата при попадании на один маршрут

weaver 11.09.2018 10:15

Позвольте нам продолжить обсуждение в чате.

rkj 11.09.2018 10:20

проверить сообщение в чате

rkj 11.09.2018 10:49

В настоящее время я использую Laravel 7, и в своем контроллере я передаю массив объектов коллекции классу ресурсов.

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

и в моем классе ресурсов я могу получить доступ к данным, используя

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

Другие вопросы по теме