Подтвердить что ты не робот

Контроллер Laravel 5, отправляющий целое число JSON в виде строки

На моем сервере разработки ответ JSON от контроллера Laravel 5 отображает данные в правильных типах.

например

imdb_rating: 7.6
imdb_votes: 6271

Но на рабочем сервере ответ JSON отправляется обратно как строки.

imdb_rating: "7.60"
imdb_votes: "6271"

В обеих версиях и выпусках установлена ​​такая же версия PHP (5.6.11-1).

Любые идеи о том, что может вызывать такое поведение?

4b9b3361

Ответ 1

Обязательно используйте Исходный драйвер MySQL, который будет поддерживать собственные типы данных.

Можно преобразовать столбцы 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);

Ответ 2

Я просто столкнулся с этой проблемой! Для тех из вас, кто ищет более подходящее решение, вы можете проверить свойство $casts для моделей Eloquent.

Принятое решение будет работать, но оно также преобразует поля, которые вы не захотите преобразовать. Я бы порекомендовал добавить это в вашу модель Eloquent:

protected $casts = [ 'imdb_rating' => 'float', 'imdb_votes' => 'integer' ];

Это преобразует значения непосредственно в объект модели, поэтому вам не нужно беспокоиться об обновлении нескольких конечных точек. Надеюсь, это поможет другим, как и я!