2016-12-14 1 views
0

ich LVL 5.2.45 auf beiden Systemen ausgeführt wird:Laravel 5: numerische Werte als Ganzzahlen oder String in verschiedenen Systemen ausgegeben?

  • OSX 10.11.6, mit PHP 7.0.13 (Homebrew)
  • Ubuntu 14.04.5, mit PHP 5.5.9-1ubuntu4.20

ich erhalte zwei verschiedene Ausgaben von diesem Code (zB in Tinker.):

App\Product::where('name', 'big brown bag')->get(); 

auf OSX gibt sie:

App\Product {#744 
id: 54, 
name: "Big Brown Bag", 
category_id: 3, 
company_id: 1, 
} 

auf Ubuntu:

App\Product {#744 
id: 54, 
name: "Big Brown Bag", 
category_id: "3", 
company_id: "1", 
} 

Beachten Sie die doppelten Anführungszeichen um die IDs in der Ubuntu-Ausgabe. Die gleichen Ausgaben in einem JSON.

Wie könnte ich das normalisieren? Genauer gesagt, wie könnte ich es zwingen, die IDs als Ganzzahlen auszugeben?

Vielen Dank im Voraus

Antwort

1

Als Ihr Fall sehr interessant für mich war, verbrachte ich einige Zeit, um eine mögliche Antwort für Sie zu suchen. Frameworks wie Laravel verwenden das PDO für die Arbeit mit verschiedenen Arten von DBMS und diese Art von Ansatz erfordert spezielle Treiber.

Ich denke, das Problem liegt an der php5-mysql-Bibliothek, die an der Interaktion mit Ihrer MySQL-Datenbank beteiligt ist: Diese Bibliothek konvertiert die Zahl-Typ-Spalten nicht in eine Typnummer, die Eloquent ORM mit einer Zeichenfolge -Typ im Gegenzug.

Eine mögliche Lösung ist die php5-mysql Bibliothek mit php5-mysqlnd (sudo apt-get install php5-mysqlnd) zu ersetzen. Tatsächlich gibt die mysqlnd-Bibliothek einen Zahlentypwert anstelle einer unbedeutenden Zeichenfolge zurück. Da Sie in Ihren Umgebungen mit zwei verschiedenen Arten von PHP-Versionen arbeiten, bin ich mir ziemlich sicher, dass es nur eine Frage verschiedener Bibliotheken ist (und eine andere Art, den Wertdatentyp zu behandeln).

Eine schnellere aber Dirt Lösung ist die $ Descriptions protected Eigenschaft als ein Array zu definieren, wo der Schlüssel die Spalte ist und der Wert ist der Typ, den Sie möchten, dass der Wert gegossen wird. Im Beispiel:

protected $casts = ['category_id' => 'integer'] 

This paragraph of the Laravel docs hilfreich sein wird, die in dieser Art von Ansatz interessiert ist

Wie auch immer, diese Art von Problemen sollte für das Entwicklerteam gepackt mit einer virtuellen Maschine vermieden werden. Laravel bietet eine fantastische virtuelle Umgebung (ich bin sicher, dass Sie bereits von Homestead gehört haben), die Sie sogar für andere webbasierte Anwendungen, Frameworks und CMS verwenden können.

+0

Vielen Dank für die Zeit und die Vollständigkeit der Erklärung. –

Verwandte Themen