web-dev-qa-db-fra.com

Laravel 5 contrôleur envoyant un entier JSON sous forme de chaîne

Sur mon serveur de développement, la réponse JSON du contrôleur Laravel 5 affiche les données dans les types corrects.

par exemple

imdb_rating: 7.6
imdb_votes: 6271

Mais sur le serveur de production, la réponse JSON est renvoyée sous forme de chaînes.

imdb_rating: "7.60"
imdb_votes: "6271"

Le développement et la production ont la même version de PHP installé (5.6.11-1).

Des idées sur ce qui peut être à l'origine de ce comportement?

26
Muggles

Assurez-vous d'utiliser MySQL Native Driver qui prendra en charge les types de données natifs.

Il est possible de reconvertir les colonnes entières et flottantes en PHP nombres en définissant l'option de connexion MYSQLI_OPT_INT_AND_FLOAT_NATIVE, si vous utilisez la bibliothèque mysqlnd. Si elle est définie, la bibliothèque mysqlnd vérifiera les types de colonne de métadonnées du jeu de résultats et convertir les colonnes SQL numériques en PHP nombres, si la plage de valeurs du type de données PHP le permet. De cette façon, par exemple, les colonnes SQL INT sont renvoyées sous la forme entiers.

La bibliothèque cliente MySQL renverra tous les champs sous forme de chaînes.

Une autre solution serait d'utiliser les options json_encode avec JSON_NUMERIC_CHECK.

Par exemple:

return response()->json(["foo" => "bar"], 200, [], JSON_NUMERIC_CHECK);
44
DavidDomain

Je viens de rencontrer ce même problème! Pour ceux d'entre vous qui recherchent une solution plus appropriée, vous voudrez peut-être consulter le $casts propriété pour les modèles Eloquent.

La solution acceptée fonctionnera, mais elle convertira également les champs que vous ne souhaitez peut-être pas convertir. Je recommanderais d'ajouter ceci à votre modèle Eloquent:

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

Cela convertira les valeurs directement dans votre objet de modèle, vous n'aurez donc pas à vous soucier de la mise à jour de plusieurs points de terminaison. J'espère que cela aide les autres comme moi!

53
David R. Myers II