Двойники теряют свои десятичные разряды в юнит-тестах - PullRequest
1 голос
/ 30 января 2020

Итак, я нахожусь в процессе обновления старого Laravel проекта с 5,3 до 5,4 (планируем перейти на 5,8), но у меня возникла проблема с моими модульными тестами, в которой удваивается теряют свои десятичные разряды.

Вот пример одного такого теста ( да, мои тесты взаимодействуют с базой данных ):

$this->user->message_score = 3.42;
$this->user->save();
echo $this->user->fresh()->message_score; // 3

Миграция для таблицы:

$table->double('message_score')->nullable();

Какое бы число я ни установил, десятичные разряды теряются. Это не округление вверх или вниз, 3,42 становится 3, как и 3,99.

Тинкер не имеет такой же проблемы.

I предположим, что я упускаю что-то простое.

Любая помощь приветствуется.

EDIT

Итак, я запустил миграцию, чтобы обновить точность message_score, и я столкнулся с тем же проблема. Длина, отображаемая в базе данных до запуска миграции, составляла (8,2), а выполненная мною миграция подтолкнула ее до (10,8). Миграция ниже:

DB::statement('ALTER TABLE `users` MODIFY `message_score` DOUBLE(10,8) NOT NULL DEFAULT 0.0;');

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы должны включить точность в свои миграции:

$table->double('message_score', 8, 2)->nullable();
0 голосов
/ 31 января 2020

Проблема связана с соединением MYSQL, в частности, для PDO::ATTR_EMULATE_PREPARES установлено значение true.

PDO :: ATTR_EMULATE_PREPARES - это то, что позволяет повторно использовать параметры в подготовленном выражении, Например, вы можете просто использовать :id вместо :id1, :id2, :id3. Когда он установлен на true на PHP> = 7,2 , все плавающие числа приводятся к целому числу, поэтому теряется точность. Это связано с тем, что Laravel не поддерживает этот флаг PDO.

По сути, есть две опции:

Установить PDO :: ATTR_EMULATE_PREPARES в значение false и затем запустить уникальное именование параметров, например :id1, :id2, :id3.

Или

Установите ваши числа с плавающей запятой на строки, после чего они сохранят свои десятичные разряды, поскольку Laravel больше не будет видеть его как число с плавающей запятой и приведёт его к целому числу.

Вот проблема на GitHub, если вы хотите узнать больше об этом: https://github.com/laravel/framework/issues/23850

...