Как правильно отправить отсортированную модель с моего контроллера в коллекцию ресурсов API Laravel? - PullRequest
1 голос
/ 08 апреля 2020

Это мой контроллер:

    public function branchesNearby($lat, $lng)
{

    $branches = Branch::all();

    //Calculate distance between each branch and client
    //Radius of earth is 6371 KM so multiply the result with radius of earth 6371*pi/180
    foreach ($branches as $branch){
    $branch['distance'] = sqrt(pow(($branch->lat - $lat), 2) + pow(($branch->lng - $lng), 2)) * 108;
    }

    //Sort by nearest first
    $sortedBranches = $branches->sortBy('distance');

    return BranchResource::collection($sortedBranches);

}

Вы можете видеть, что я создал дополнительный атрибут для вычисления расстояния между местоположением пользователя и местоположением филиала. Затем я сортирую модель филиала по расстоянию. Тем не менее, API-ответ, который я получаю: API-ответ

Вы можете видеть, что это объект. Мне не нужны клавиши «2», «0» и «1». Мне нужно удалить эту дополнительную упаковку, и мне нужно, чтобы это был массив таких объектов: Правильный API, но без сортировки Конечно, это сортировка, которая заставляет его становиться объектом? Я пробовал много других способов, одним из которых было:

$sortedBranches = $collection->sortBy('distance');
$final = $sortedBranches->values()->toJson(); 

и отправка этого $ final в коллекцию ресурсов. Это дает мне ошибку: «вызов функции-члена first () для строки в файлах API-ресурсов». Это должно быть что-то маленькое, но мне действительно нужна помощь.

Обновление: я не публиковал свой ресурс раньше, вот как это выглядит:

    public function toArray($request)
    {

        return [
            'id' => $this->id,
            'shop' => $this->shop->name,
            'shop_image' => asset('api/images/' . $this->shop->image_file),
            'lat' => $this->lat,
            'lng' => $this->lng,
            'shop_logo' => asset('api/images/' . $this->shop->logo_file),
            'distance' => $this->distance . " KM"

        ];

Ошибка, которую я получаю, если использую :

$sortedBranches = $branches->sortBy('distance')->values()->all();
   return BranchResource::collection($sortedBranches);

: Ошибка

Обновление 3:

Если я не вызову коллекцию ресурсов и просто выведу $ sortedBranches вот так:

return response()->json($sortedBranches, 200);

Здесь формат ответа API правильный, но данные неверные. Вот как это выглядит: $ sortedBranches

Есть ли способ, которым я могу манипулировать $ sortedBranches и показывать вывод, как с BranchResource?

1 Ответ

0 голосов
/ 08 апреля 2020

Исходя из нашего устранения неполадок, результирующее решение должно быть:

return BranchResource::collection($sortedBranches)->values()->all();

Когда вы передаете коллекцию в метод collect класса BranchResource, она заново создает коллекцию. Laravel видит, что вы возвращаете (коллекцию) объект непосредственно из вашего контроллера, и вмешивается, приводя его к json (я считаю, что это по умолчанию). Если полученный json не преобразован так, как вы хотите, вам нужно изменить эту коллекцию. Поэтому нам нужно было изменить коллекцию BranchResource::collection(), а не коллекцию $sortedBranches.

Редактировать:

  • Модифицированный метод сбора в коллекцию;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...