@dasauser
Пишу на PHP

Что не так с update запросом?

yii2, не могу сделать множественный update (нужно обновить ~10к записей).
запрос выглядит так:
UPDATE `product`
SET `name`=(
  CASE
    WHEN `code`=122 THEN "product_name1"
    /*...*/
    WHEN `code`=125 THEN "product_nameN"
  END)
WHERE `code` IN (122,125,/*...*/, 999999);

код php:
$sql = ''
    . 'UPDATE {{' . Products::tableName() . '}}'
    . ' SET [[name]]=(CASE';
foreach ($name_update_array as $record_code => $record_name) {
    $sql .= ' WHEN [[code]]=' . $record_code . ' THEN "' . $record_name . '"';
}
$sql .= ' END) WHERE [[code]] IN (' . implode(',', array_keys($name_update_array)) . ')';
$query = \Yii::$app->db->createCommand($sql);
try {
    $query->execute();
}
catch (\Exception $exception) {
    Log::addLog([
        'logfile' => $this->logfile,
        'name' => $settings['name'],
        'status' => 'ERROR',
        'data' => $exception
    ]);
    return false;
}


ошибка:
Next yii\db\Exception: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

при ручном вводе и на малых количествах записей все прекрасно отрабатывает.
UPDATE product SET name=(CASE WHEN code=121 THEN "qwe" WHEN code=122 THEN "qweasd" END) WHERE code IN (121,122,125,126,127);
Query OK, 5 rows affected, 3 warnings (0.03 sec)
Rows matched: 5  Changed: 5  Warnings: 3

как исправить?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
@dasauser Автор вопроса
Пишу на PHP
расходимся.
передавался кривой json, где было название с кавычками, и при попытке составить запрос выходило как-то так:
...name="продукт с названием"название продукта" вес 500 кг"...
починил так:
$sql .= ' WHEN [[code]]=' . $record_code . ' THEN \'' . $record_name . '\'';
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы