2016-11-23 2 views
2

я используюLaravel возвращающегося intergers в ответ JSon

$user = User::find($user_id); 
return response()->json(array('user'=>$user),200); 

На локальном сервере с php5.9 он возвращает все ключи, кроме идентификатора в качестве строки.

{ 
    "success": "1", 
    "message": "success", 
    "user": { 
     "id": 75, 
     "name": "", 
     "postal_code": "73733", 
    } 
} 

Но тот же код на производственном сервере с php7.0 возвращает другие ключи по типу integer ex. проверьте это значение postal_code.

{ 
    "success": "1", 
    "message": "success", 
    "user": { 
     "id": 75, 
     "name": "", 
     "postal_code": 73733, 
    } 
} 

Так решить эту проблему, я использую $cast=[] в User.php.

Но я также использовал необработанные запросы. Каков наилучший способ преобразования всех значений в ответе json типа string.

+0

Есть ли PHP 5.9? что именно означает $ cast = [], кроме создания экземпляра пустого массива? – flauntster

ответ

3

Разница в типе, скорее всего, связанно с тем, что ваш локальным сервером с помощью (неродной) драйвером php5-mysqld, в то время как ваш производственный сервер, вероятно, с помощью php-mysqlnd (родной). Одно из основных отличий заключается в том, что неродный драйвер считывает все поля в виде строк, тогда как собственный драйвер автоматически преобразует целочисленные поля в целые числа PHP.

id отображается как целое число в обоих случаях, поскольку Laravel автоматически добавляет поле первичного ключа («ID») в массив слепков с типом определяемой $keyType собственности (по умолчанию для int).

Я бы сказал, у вас есть четыре варианта:

  1. Попытка установить неродной драйвер MySQL для PHP 7 на производственном сервере (не рекомендуется).

  2. Не делайте ничего на стороне PHP и просто убедитесь, что все, что потребляет json, может обрабатывать строки или целые числа (вероятно, хорошая идея в любом случае, но по-прежнему не решает реальной проблемы).

  3. Добавить postal_code в массив casts, чтобы гарантировать, что он всегда отбрасывается в строку (неплохо, это будет работать в большинстве случаев, но это не совсем точное решение).

  4. Изменение типа поле postal_code поля от integer к varchar(5), varchar(9) или varchar(10), в зависимости от того, если вы собираетесь хранить +4, и с или без дефиса (лучшее решение).

Изменение типа postal_code данных в базе данных в varchar действительно является лучшим вариантом. Основная причина заключается в том, что, хотя они состоят из чисел, почтовые коды не являются фактически целыми числами или численными. Вы никогда не будете делать с ними арифметику.Кроме того, существуют почтовые коды, начинающиеся с ведущего 0, и если значение хранится как целое число, это дополнительное условие кромки, с которым вам приходится сталкиваться при каждом появлении почтовых кодов.

+0

спасибо @patricus. – dev21

0

Вы можете бросить в строку, как:

$user['postal_code'] = (string) $user['postal_code']; 

Дополнительная информация о кастинге переменной типа находится в PHP manual.

Надеется, что это помогает :)

0

Включение настройки PDO :: ATTR_STRINGIFY_FETCHES позволит решить эту проблему. Вы можете добавить этот параметр PDO в конфигурации базы данных.

'options' => array(
    PDO::ATTR_STRINGIFY_FETCHES => true, 
), 
Смежные вопросы