#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);
}
Попробуйте это, и порядок сортировки также будет сохранен во внешнем интерфейсе