Сохранить связанные данные в базу данных с помощью CakePHP и HABTM - PullRequest
0 голосов
/ 01 августа 2011

У меня есть 2 таблицы: release_servers и release_components
У меня есть таблица ссылок release_server_to_components

У меня сейчас есть такая возможность, что на каждом сервере может быть несколько компонентов и каждый компонент можетбыть на нескольких серверах.

Ниже приведены операторы создания:

CREATE TABLE `release_components` (
  `id` int(11) NOT NULL auto_increment,
  `buildID` varchar(45) default NULL,
  `svnNumber` varchar(45) NOT NULL,
  `componentType` varchar(45) NOT NULL,
  `release_id` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM 

CREATE TABLE `release_servers` (
  `id` int(11) NOT NULL auto_increment,
  `server_name` varchar(45) NOT NULL,
  `server_environment` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM

Таблица ссылок:

CREATE TABLE `release_server_to_components` (
  `id` int(11) NOT NULL auto_increment,
  `release_component_id` int(11) NOT NULL,
  `release_server_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM 

Я хочу добавить возможность иметьидентификатор системы - этот идентификатор системы будет указываться для каждого компонента на сервере (не для каждого сервера и не для каждого компонента, а для каждого компонента на каждом сервере).Я хочу, чтобы можно было легко добавлять идентификатор системы для каждого компонента и вставлять его в базу данных.

При необходимости я могу предоставить код для моделей и контроллеров.

1 Ответ

1 голос
/ 01 августа 2011

Вы хотите "подделать" Руби через ассоциацию с CakePHP.

Почему это через HABTM?

Потому что вы хотите сохранить данные об ассоциации. С Cake HABTM сохранение данных об ассоциации затруднено, потому что единственное, что у вас есть, - это таблица JOIN. Вам нужно что-то более мощное, чем это.

Во-первых, избавьтесь от свойства $hasAndBelongsToMany в вашей модели. Далее мы переоборудуем вашу таблицу release_server_to_components в качестве таблицы «сквозного».

Итак, в ReleaseComponent и ReleaseServer модели вы бы имели такую ​​ассоциацию:

$hasMany = array('ReleaseServerToComponent');

Теперь в вашей новой модели ReleaseServerToComponent у вас будет ассоциация, подобная этой:

$belongsTo = array('ReleaseComponent', 'ReleaseServer');

Теперь вы можете получить доступ к этой таблице, как и в обычной модели Cake, то есть $this->ReleaseServer->ReleaseServerToComponent->find(). Вы можете добавить дополнительные поля в сквозную таблицу, например server_component_name. У вас уже есть уникальный идентификатор для конкретных серверных компонентов с первичным ключом таблицы release_server_to_components.

Вы можете сохранить эти данные, используя Cake's saveAll() метод . В качестве альтернативы вы можете сгенерировать свои собственные данные для сохранения, просто вставив идентификатор сервера и идентификатор компонента из полей формы. В верхней части этой ссылки находится формат сохраненных данных, когда вы передаете их в метод сохранения модели.

...