Laravel 5 controller sending JSON integer as string

23,507

Solution 1

Make sure to use MySQL Native Driver which will support native data types.

It is possible to convert integer and float columns back to PHP numbers by setting the MYSQLI_OPT_INT_AND_FLOAT_NATIVE connection option, if using the mysqlnd library. If set, the mysqlnd library will check the result set meta data column types and convert numeric SQL columns to PHP numbers, if the PHP data type value range allows for it. This way, for example, SQL INT columns are returned as integers.

MySQL Client Library will return all fields as strings.

Another solution would be to use json_encode options with JSON_NUMERIC_CHECK.

For example:

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

Solution 2

I just ran into this same issue! For those of you looking for a more appropriate solution, you might want to check out the $casts property for Eloquent models.

The accepted solution will work, but it will also convert fields that you may not want converted. I would recommend adding this to your Eloquent model:

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

This will convert the values directly in your model object, so you won't need to worry about updating multiple endpoints. I hope this helps others as it did me!

Share:
23,507
Muggles
Author by

Muggles

Updated on December 30, 2020

Comments

  • Muggles
    Muggles over 3 years

    On my development server the JSON response from the Laravel 5 controller shows the data in the correct types.

    e.g

    imdb_rating: 7.6
    imdb_votes: 6271
    

    But on the production server, the JSON response is sent back as strings.

    imdb_rating: "7.60"
    imdb_votes: "6271"
    

    Both development and production have the same version of PHP installed (5.6.11-1).

    Any ideas on what may be causing this behaviour?

  • Alejandro Silva
    Alejandro Silva almost 8 years
    this finally solve my problem, the installation process is quite simple in ubuntu: apt-get remove php5-mysql,apt-get install php5-mysqlnd, service apache2 restart
  • Esselans
    Esselans over 7 years
    Thanks. =D. Works con CentOS via installing php55w-mysqlnd
  • TomWilsonFL
    TomWilsonFL over 7 years
    Excellent solution. I like that this solves the issue regardless of underlying platform. Here's a quick link to the docs. Great stuff here: laravel.com/docs/5.4/eloquent-mutators#attribute-casting
  • zeros-and-ones
    zeros-and-ones almost 7 years
    Annoyed that laravel requires this overhead to fix the data types. How does this affect performance?
  • kiradotee
    kiradotee over 6 years
    It worked! But I still don't quite understand when my DB datatype is tinyint why do I need to manually cast it to an int? Ridiculous!
  • Tim Head
    Tim Head almost 6 years
    This must be the accepted answer I agree. I nearly followed the accepted answer and would have regretted the mess it could have caused in my code.
  • Mike Ross
    Mike Ross over 4 years
    Why does this not working for me and the other one is? I am casting ` 'latitude' => 'double' `, it still sends as string.
  • Mohammed Riyadh
    Mohammed Riyadh almost 4 years
    Thanks, this is very useful