Ответ Ajax не возвращается в отсортированном виде контроллер laravel

#php #json #laravel #laravel-5

#php #json #laravel #laravel-5

Вопрос:

Я извлекаю данные из базы данных, а затем добавляю к этому объекту еще одно свойство, которое является расстоянием. и сортировка данных объекта на основе этого свойства. Когда я dd () это в контроллере, чтобы проверить, отсортированы ли данные или нет. Я вижу, что данные отсортированы, но когда я возвращаю их как ответ JSON, он возвращается так, как он поступил из базы данных.

функция контроллера

 
 public function search(Request $request)
    {
 

    $providers = Provider::get()->map(function($item) use($request){
        $item->setAttribute('distance',$this->addDistanceToProvider($item,$request)) ;
        return $item;
    })->sortBy('distance');

    dd($providers);
        return response()->json($providers);

    }

 

Ответ №1:

Поскольку результат sortBy() сохраняет исходные ключи массива, следовательно, при отправке в виде ответа json он принимается в javascript как объект (объектов), а в javascript объекты не отсортированы.

Поэтому нам нужно выполнить цепочку values() after sortBy() для сброса ключей, что приведет к получению javascript массива (объектов), поэтому сортировка, выполненная в контроллере, сохраняется

 public function search(Request $request)
{
    $providers = Provider::get()->map(function($item) use($request){
        $item->setAttribute('distance',$this->addDistanceToProvider($item,$request)) ;
        return $item;
    })->sortBy('distance')->values();

    
    return response()->json($providers);

}
 

Попробуйте это, и порядок сортировки также будет сохранен во внешнем интерфейсе