2015-07-20 11 views
19

Auf meinem Entwicklungsserver zeigt die JSON-Antwort vom Laravel 5-Controller die Daten in den richtigen Typen an.Laravel 5 Controller sendet JSON Integer als String

beispiel

imdb_rating: 7.6 
imdb_votes: 6271 

Aber auf dem Produktionsserver wird die JSON-Antwort als Strings zurückgeschickt.

imdb_rating: "7.60" 
imdb_votes: "6271" 

Sowohl Entwicklung als auch Produktion haben die gleiche Version von PHP installiert (5.6.11-1).

Irgendwelche Ideen, was dieses Verhalten verursachen könnte?

+0

Ist die von MySQL-Tabelle kommenden Daten? – DavidDomain

+0

@DavidDomain Ja – Muggles

+3

Klingt dumm, aber können Sie überprüfen, ob Sie * MySQL Native Driver (mysqlnd) * auf beiden Rechnern verwenden? * MySQL Client Library * -Treiber gibt alle Felder als Strings unabhängig vom Typ zurück, was bei der Verwendung von * MySQL Native Driver nicht der Fall ist * – DavidDomain

Antwort

36

Stellen Sie sicher, dass MySQL Native Driver verwendet wird, das native Datentypen unterstützt.

Es ist möglich, integer zu konvertieren und Spalten zurück zu PHP Zahlen schweben durch die MYSQLI_OPT_INT_AND_FLOAT_NATIVE Verbindungsoption einstellen, wenn die mysqlnd Bibliothek. Wenn gesetzt, prüft die Bibliothek mysqlnd die Metadatentypen der Ergebnismenge und wandelt numerische SQL-Spalten in PHP-Zahlen um, wenn der Wertebereich des PHP-Datentyps dies zulässt. Auf diese Weise werden beispielsweise SQL INT-Spalten als Ganzzahlen zurückgegeben.

Die MySQL Client-Bibliothek gibt alle Felder als Strings zurück. Eine andere Lösung wäre die Verwendung von json_encode Optionen mit JSON_NUMERIC_CHECK.

Zum Beispiel:

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

dies schließlich mein Problem zu lösen, ist der Installationsvorgang in ubuntu ziemlich einfach: 'apt-get entfernen php5-mysql',' apt-get installieren php5-mysqlnd', 'service apache2 restart' –

+0

Danke. = D. Works con CentOS über die Installation von php55w-mysqlnd – Jaxedin

28

Ich lief in das gleiche Problem! Für diejenigen von Ihnen, die nach einer angemesseneren Lösung suchen, sollten Sie die Eigenschaft $casts für Eloquent-Modelle ausprobieren.

Die akzeptierte Lösung funktioniert, aber es konvertiert auch Felder, die nicht konvertiert werden sollen. Ich würde, diese zu Ihrem Eloquent Modell empfehlen:

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

Dadurch werden die Werte direkt in Ihrem Modell-Objekt konvertieren, so dass Sie nicht über die Aktualisierung mehrere Endpunkte kümmern müssen. Ich hoffe, das hilft anderen wie mir!

+0

Ausgezeichnete Lösung. Ich mag, dass dies das Problem unabhängig von der zugrunde liegenden Plattform löst. Hier ist ein kurzer Link zu den Dokumenten. Tolle Sachen hier: https://laravel.com/docs/5.4/eloquent-mutators#attribute-casting – TomWilsonFL

+0

Dies muss die akzeptierte Antwort sein. – shxfee

+1

Verärgert, dass Laravel diesen Overhead benötigt, um die Datentypen zu reparieren. Wie wirkt sich das auf die Leistung aus? –

-1

können Sie fügen ändern

'options' => array(
       PDO::ATTR_STRINGIFY_FETCHES => false 
     ), 

in Ihre config/database.php

ZB:

'connections' => [ 

    'dbname' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_HOST_NAME', 'localhost'), 
     'database' => env('DB_DATABASE_NAME', 'forge'), 
     'username' => env('DB_USERNAME_NAME', 'forge'), 
     'password' => env('DB_PASSWORD_NAME', ''), 
     'charset' => 'utf8mb4', 
     'collation' => 'utf8mb4_unicode_ci', 
     'prefix' => '', 
     'strict' => false, 
     'options' => array(
       PDO::ATTR_STRINGIFY_FETCHES => false 
     ), 
    ] 
],