Модель Yii с составным первичным ключом
первичный элемент моей таблицы MySQL состоит из 2 столбцов: space_id (целое число) и day (дата).
CREATE TABLE `ck_space_calendar_cache` (
`space_id` int(11) NOT NULL,
`day` date NOT NULL,
`available` tinyint(1) unsigned NOT NULL DEFAULT '0',
`price` decimal(12,2) DEFAULT NULL,
`offer` varchar(45) DEFAULT NULL,
`presale_date` date DEFAULT NULL,
`presale_price` decimal(12,2) DEFAULT NULL,
`value_x` int(11) DEFAULT NULL,
`value_y` int(11) DEFAULT NULL,
PRIMARY KEY (`space_id`,`day`),
KEY `space` (`space_id`),
CONSTRAINT `space` FOREIGN KEY (`space_id`) REFERENCES `ck_space` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Он отлично работает в raw SQL, он жалуется, если я пытаюсь создать дубликат, но позволяет мне создавать строки в тот же день или тот же space_id.
однако в Yii при использовании new Object () и save () он жалуется, что "space_id" должен быть уникальным.
я использовал "Giix" для генерации модели, если это имеет значение.
Я попытался добавить этот код в модель, но это не помогло:
public function primaryKey(){
return array('space_id', 'day');
}
2 ответов
добавление этого кода в класс ActiveRecord нормально, но не должно быть необходимо, потому что Yii уже имеет эту информацию из объявления таблицы MySQL.
public function primaryKey(){
return array('space_id', 'day');
}
когда Yii жалуется на уникальность "space_id", giix, возможно, добавил правило проверки в rules() в вашем классе ActiveRecord. Эти правила проверяются перед сохранением ActiveRecord, и он будет сохранен, только если все правила в порядке. Прочтите раздел проверки данных окончательного руководства для подробная информация.
из того, что я понимаю, поскольку составные первичные ключи Yii 1.1 больше не поддерживаются Gii, что расстраивает многих разработчиков. Есть и другие плохо документированные изменения, необходимые в коде, помимо возврата массива в качестве первичного ключа.
лучшее объяснение, которое я нашел, было в этом обсуждении на форуме Yii.