На моем сервере разработки ответ JSON от контроллера Laravel 5 показывает данные в правильных типах.
например
imdb_rating: 7.6 imdb_votes: 6271
Но на рабочем сервере ответ JSON отправляется обратно как строки.
imdb_rating: "7.60" imdb_votes: "6271"
В обоих версиях и выпусках установлена такая же версия PHP (5.6.11-1).
Любые идеи о том, что может вызывать такое поведение?
Обязательно используйте MySQL Native Driver, который будет поддерживать собственные типы данных.
Можно преобразовать столбцы integer и float обратно в номера PHP, установив параметр MYSQLI_OPT_INT_AND_FLOAT_NATIVE connection, если вы используете библиотеку mysqlnd. Если установлено, библиотека mysqlnd проверит типы столбцов метаданных набора результатов и преобразует числовые столбцы SQL в номера PHP, если это позволяет диапазон значений типа данных PHP. Таким образом, например, столбцы SQL INT возвращаются как целые числа.
Клиентская библиотека MySQL вернет все поля в виде строк.
Другим решением было бы использовать параметры json_encode с JSON_NUMERIC_CHECK
.
Например:
return response()->json(["foo" => "bar"], 200, [], JSON_NUMERIC_CHECK);
Я просто столкнулся с этой проблемой! Для тех из вас, кто ищет более подходящее решение, вы можете проверить свойство $casts
для моделей Eloquent.
Принятое решение будет работать, но оно также преобразует поля, которые вы не захотите преобразовать. Я бы порекомендовал добавить это в вашу модель Eloquent:
protected $casts = [ 'imdb_rating' => 'float', 'imdb_votes' => 'integer' ];
Это преобразует значения непосредственно в объект модели, поэтому вам не нужно беспокоиться об обновлении нескольких конечных точек. Надеюсь, это помогает другим, как и я!