find() on model gives id as string in one environm

2019-01-28 05:01发布

问题:

I am using Laravel 5 and have a model Book.

I have two environments - dev and production

On dev: In tinker, when I do

Book::first()

It gives me

App\Book {
     id: 1,
     name: ...

On produvction: The same thing gives me

App\Book {
         id: "1",
         name: ...

Notice the id is int in dev but string on production

Because of this, a condition like

if($id === $book->id)

which works correctly on dev, doesn't work on production.

Any idea why this is so? Is there a way I can make production environment to give me int instead of string?

PS:

  1. I have installed Laravel on dev and then pulled the code on production via git. So my composer.json and composer.lock are exactly same on dev and production. So running composer install on production should give me same environment there as on dev.
  2. I am using mysql database.
  3. My dev environment is Laravel's homestead.
  4. Book is just a dummy model I've used here. All my models behave in the same manner as explained above.

回答1:

Obviously you don't want to do any manual casting as suggested in comment. It seems that on one server you miss mysqlnd extension (I need to assume you use MySQL because you haven't mentioned it in your question) what causes that all data types are returned as strings.