ON DUPLICATE KEY UPDATE

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

ON DUPLICATE KEY UPDATE

Сообщение gbushmakin »

Не могу понять. Имеется большой массив состоящий из ~5000 деталей товаров, выгружаемый из таблицы у поставщика (актуальная цена, количество, артикул).

Эти все товары выгружены ко мне в таблицу mysql. При обновлении берется массив товаров от поставщика, сравнивается цена и количество IF, а дальше, если в цене или количестве есть отличия - открывается массив $updateProd[] и в нем пишутся изменения.

Дальше уже исходя от массива делается вот такой запрос

Код: Выделить всё

   if (isset($updateProd)) {
        $fields = ['ID', 'PRICE', 'QUANTITY'];
        $db = Yii::$app->db;
        $sql = $db->queryBuilder->batchInsert(Suppliers::tableName(), $fields, $updateProd);
        $product_insert_count = $db->createCommand($sql . ' ON DUPLICATE KEY UPDATE `QUANTITY` = VALUES(`QUANTITY`), `PRICE` = VALUES(`PRICE`)')->execute();
    }
И в основном всё хорошо и всё обновляется! НО! Не понятно по каким причинам, некоторые строки (а их где-то около 100), обновляться хотят, НО т.к. я PRICE умножаю на 100 (для плавающей точки), то некоторые поля идут на 1 единицу ниже. т.е. 456,20 руб * 100 = 45620, массив закладывает число 45620, а передается в таблицу на 1 меньше - 45619 ! Что за ерунда?!

Я уже и поля в (float) делал. Ничего не помогает. Код отправляет одно (смотрю отправляемый массив через print_R), смотрю через debug - отправка многих строк уменьшается на -1

И уже все перепробовал. И в ручную ячейку сторок менял в таблице - обновляться обновляется, но на 1 меньше.
ДА, а некоторые возможно и обновляются правильно, но после перепроверки if ($oldPrice['ARTICUL'] != $newPrice) они проходят эту проверку не взирая на полною точность и дальше идут по скрипту, снова помещаются в массив и обновляются.

Ещё раз повторюсь, переменную PRICE уже делал (float), но даже это не помогло. Вроде как числовая переменная получается.

Подозрения есть, но все они рушатся о логику, что не должно быть так. Каково ваше мнение? Кто что может подсказать?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: ON DUPLICATE KEY UPDATE

Сообщение Loveorigami »

Тип колонки в самой таблице какой? Вместо float используй decimal.

https://stackoverflow.com/questions/256 ... son-issues
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

Re: ON DUPLICATE KEY UPDATE

Сообщение gbushmakin »

Loveorigami писал(а): 2019.07.11, 13:48 Тип колонки в самой таблице какой? Вместо float используй decimal.

https://stackoverflow.com/questions/256 ... son-issues
Тип колонки INT. Поэтому и умножаю на 100
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: ON DUPLICATE KEY UPDATE

Сообщение Loveorigami »

Чудес не бывает...
- Найдите проблемную строку.
- Передайте ей явно 111

Код: Выделить всё

  
   if (isset($updateProd)) {
        $fields = ['ID', 'PRICE', 'QUANTITY'];
        $db = Yii::$app->db;
        $sql = $db->queryBuilder->batchInsert(Suppliers::tableName(), $fields, 111);
        $product_insert_count = $db->createCommand($sql . ' ON DUPLICATE KEY UPDATE `QUANTITY` = VALUES(`QUANTITY`), `PRICE` = VALUES(`PRICE`)')->execute();
    }
Уменьшилось на 1?
Если нет - смотрите $updateProd через var_dump. Какой тип перед умножением?
После расчетов приведите переменную с ценой к (int) в массиве $updateProd;
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

Re: ON DUPLICATE KEY UPDATE

Сообщение gbushmakin »

Loveorigami писал(а): 2019.07.11, 15:47 Чудес не бывает...
- Найдите проблемную строку.
- Передайте ей явно 111

Код: Выделить всё

  
   if (isset($updateProd)) {
        $fields = ['ID', 'PRICE', 'QUANTITY'];
        $db = Yii::$app->db;
        $sql = $db->queryBuilder->batchInsert(Suppliers::tableName(), $fields, 111);
        $product_insert_count = $db->createCommand($sql . ' ON DUPLICATE KEY UPDATE `QUANTITY` = VALUES(`QUANTITY`), `PRICE` = VALUES(`PRICE`)')->execute();
    }
Уменьшилось на 1?
Если нет - смотрите $updateProd через var_dump. Какой тип перед умножением?
После расчетов приведите переменную с ценой к (int) в массиве $updateProd;
Действительно, помог полный анализ через var_dump. Оказалось, что от поставщика приходила цена в (float), поэтому и бадались они с моей строкой из таблицы. Огромное спасибо!
Ответить