В одном из моих контроллеров у меня есть следующий код:
$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
может быть как-то загрязнена?
Edit:
Если я выполню DB::getQueryLog()
по первому запросу, я получу:
array (
0 =>
array (
'query' => 'select * from `devices` where `sim` = ?',
'bindings' =>
array (
0 => 8944502311119819084,
),
'time' => 0.76,
),
)
Редактировать # 2;
Хорошо, технически мой первоначальный пример кода показал $sim = '8944502311119819084';
. В моей ситуации real этот номер сима поступает по маршруту. И это приходит как int
- который имеет все значение в мире. Если я переключу его на string
, он будет работать нормально. Итак, теперь я переключил свой пример на использование его в качестве целого числа, что фактически теперь нарушает обе ситуации.
Я думаю, это связано с максимальным значением для целых чисел в PHP, но я проверил, что я нахожусь в 64-битной системе с 64-битным PHP, который имеет максимальный размер целого числа: 9,223,372,036,854,775,807. Это выше чем сим:
Sim: 8944502311119819084
Max: 9223372036854775807
Есть ли еще какая-то причина, по которой такое большое целое число не будет поддерживаться MySql или чем-то еще?