【问题标题】:find() on model gives id as string in one environment and int in other模型上的 find() 在一个环境中将 id 作为字符串,在另一个环境中将 int
【发布时间】:2016-10-28 08:21:27
【问题描述】:

我正在使用 Laravel 5 并且有一个模型 Book

我有两个环境 - devproduction

开发上: 在tinker,当我这样做时

Book::first()

它给了我

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

关于生产: 同样的事情给了我

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

注意iddev 中是int,但在production

中是string

因此,像这样的条件

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

dev上正常工作,在生产上不工作。

知道为什么会这样吗?有没有办法让我生产环境给我int而不是string

PS:

  1. 我已经在 dev 上安装了 Laravel,然后通过 gitproduction 上提取代码。所以我的composer.jsoncomposer.lockdevproduction 上是完全相同的。所以在 production 上运行 composer install 应该会给我与 dev 上相同的环境。
  2. 我正在使用mysql 数据库。
  3. 我的dev环境是Laravel的homestead
  4. Book 只是我在这里使用的一个虚拟模型。我所有模型的行为方式都与上述相同。

【问题讨论】:

  • 不确定这是什么原因,但为id 设置您自己的cast 可能会解决问题。
  • 两个环境中的php版本是否相同?
  • @Amir 为什么我没有想到呢?我有不同版本的 php - dev 上的 5.6.7production 上的 5.5.9。这是问题吗?
  • @linuxartisan:也许,试试看
  • if($id == (int) $book->id)

标签: php mysql laravel laravel-5


【解决方案1】:

显然,您不想按照评论中的建议进行任何手动转换。似乎在一台服务器上您错过了mysqlnd 扩展名(我需要假设您使用 MySQL,因为您在问题中没有提到它)是什么原因导致所有数据类型都作为字符串返回。

【讨论】:

  • 感谢您的提示。您能否解释一下为什么您建议反对手动投射?
  • @linuxartisan 因为它应该开箱即用。在大多数系统上,int 将作为 int 返回,因此当您只是缺少另一个扩展时,您无需手动执行此操作。
  • 我刚刚遇到了同样的问题,不是因为我缺少 mysqlnd 扩展,而是因为我从 MySQL 切换到 SQLite。所以确保铸造确实可以提高可移植性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2014-05-23
  • 2017-10-23
  • 2022-06-14
  • 2020-02-12
相关资源
最近更新 更多