Моя основная таблица MySQL – это совокупность из двух столбцов: space_id (INTEGER) и дня (DATE).
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;
Он отлично работает в сыром SQL, он жалуется, если я пытаюсь создать дубликат, но позволяет мне создавать строки в тот же день или тот же space_id.
Однако в Yii при использовании новых Object () и save () он жалуется, что «space_id» должен быть уникальным.
Я использовал «Giix» для генерации модели, если это имеет значение.
Я попытался добавить этот код к модели, но это не помогло:
public function primaryKey(){ return array('space_id', 'day'); }
Добавление этого кода в класс ActiveRecord в порядке, но не обязательно, потому что Yii уже имеет эту информацию из вашего объявления таблицы MySQL.
public function primaryKey(){ return array('space_id', 'day'); }
Когда Yii жалуется на то, что «space_id» будет уникальным, giix, возможно, добавила правило проверки правил () в ваш класс ActiveRecord. Эти правила проверяются до сохранения ActiveRecord, и это будет сохраняться только в том случае, если все правила в порядке. Прочтите раздел «Проверка данных» в «Окончательном руководстве» для получения дополнительной информации.
Из того, что я понимаю с Yii 1.1, составные первичные ключи больше не поддерживаются Gii, что разочаровывает многих разработчиков. В вашем коде есть другие плохо документированные изменения, кроме возвращаемого массива в качестве первичного ключа.
Лучшее объяснение, которое я нашел, было в этой дискуссии на форуме Yii.