Модель 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.