Красноречивый возврат непредсказуемого результата с -> где () - PullRequest
1 голос
/ 15 марта 2019

В одном из моих контроллеров у меня есть следующий код:

$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 или чем-то еще?

1 Ответ

1 голос
/ 16 марта 2019

Я предполагаю, что это зависит от того, как хранится ваша sim, взгляните на это:

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

Принимая во внимание подписанные или неподписанные столбцы (я полагаю, ваш столбец подписан, что является значением по умолчанию), вам нужно, чтобы ваш столбец был BIGINT, в результате чего 2^63 -1 будет самым большим целым числом.

Но на самом деле это может быть проще сделать where('sim', (string) $sim)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...