- Код: Выделить всё
CREATE TABLE `ss_pays` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pay_sum` FLOAT(8,2) UNSIGNED NOT NULL DEFAULT '0.00' COMMENT 'Pay sum',
`client_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`purchase_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`bill_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`partner_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`partner_id_from` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`reason_id` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`dcreate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`missed` DECIMAL(1,0) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Pay is missed?',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8
Описание модели тоже стандартное. В моей реализации есть
конечно связи и т.д. но все это я отключал (переименовывал функции отвечающие за это). Баг сохраняется.
Итак где именно:
Если сделать так:
- Код: Выделить всё
$p1 = new Pay();
$p1->save();
То все нормально.
А если добавить еще хотя бы одну запись таким же образом, а потом сохранить объект $p1, то выскакивает исключение:
- Код: Выделить всё
CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '23' for key 'PRIMARY'UPDATE
`ss_pays` SET `pay_sum`=:yp0, `client_id`=:yp1, `purchase_id`=:yp2, `bill_id`=:yp3, `partner_id`=:yp4, `partner_id_from`=:yp5, `reason_id`=:yp6,
`dcreate`=NOW(), `missed`=:yp7, `id`=:yp8 WHERE `ss_pays`.`id` IS NULL
т.е. для повторения ошибки нужно выполнить код:
- Код: Выделить всё
$p1 = new Pay();
$p1->save();
$p2 = new Pay();
$p2->save();
$p1->bill_id = 1;
$p1->save();
Причем bill_id присваивать не обязательно. Ошибка и без этого.
Пока нашел решение как:
- Код: Выделить всё
$p1 = new Pay();
$p1->save();
$p2 = new Pay();
$p2->save();
$p1 = Pay::model()->findByPk($p1->getPrimaryKey());
$p1->bill_id = 1;
$p1->save();
Видимо где-то что-то... в ядро лезть не стал.
