用-> where()

时间:2019-03-15 17:58:40

标签: laravel eloquent

在我的一个控制器中,我有以下代码:

$sim = 8944502311119819084;
$firstDevice = Device::where( 'sim', $sim )->first();

$sql = "SELECT * FROM devices WHERE sim = ?";
$secondDevice = DB::select($sql, [$sim]);

Log::debug($firstDevice);
Log::debug($secondDevice);

这两个设备都返回了一个sim数字不匹配的设备,因此好像where()被忽略了。

怎么可能?此行为有任何已知的解释吗? Eloquent是否可以使用其他数据库连接(我是说99%的人不是,但是我可以完全排除这种连接),还是可以Device范围受到某种程度的污染?

编辑:

如果我对第一个请求执行DB::getQueryLog(),则会得到:

array (
  0 => 
  array (
    'query' => 'select * from `devices` where `sim` = ?',
    'bindings' => 
    array (
      0 => 8944502311119819084,
    ),
    'time' => 0.76,
  ),
)  

编辑#2;

好的,从技术上讲,我的初始代码示例显示为$sim = '8944502311119819084';。在我的 real 情况下,该SIM卡号是通过路线输入的。它以int的形式出现-改变了世界。如果我将其切换为string,它将正常工作。因此,现在我将示例转换为int,这实际上打破了这两种情况。

我认为这与PHP中整数的最大值有关,但是我已经验证我在具有64位PHP的64位系统上,该系统的最大整数大小为:9,223,372,036,854,775,807。那比sim卡高:

Sim: 8944502311119819084
Max: 9223372036854775807

还有其他原因导致MySql或某些东西不支持该高整数吗?

1 个答案:

答案 0 :(得分:1)

我猜这取决于sim的存储方式,请看以下内容:

https://dev.mysql.com/doc/refman/8.0/en/integer-types.html

考虑帐户的带符号或无符号列(我假设您的列是默认列),您需要将列设为BIGINT,从而使2^63 -1为最大整数。

但是实际上where('sim', (string) $sim)

可能更简单