使用cakephp和HABTM将关联数据保存到数据库中

时间:2011-08-01 19:16:40

标签: php mysql cakephp join has-and-belongs-to-many

我有两张桌子:release_serversrelease_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 

我想要添加的是具有系统ID的能力 - 该系统ID将是服务器上的每个组件(不是每个服务器而不是每个组件,而是每个服务器上的组件)。我希望能够轻松地为每个组件添加系统ID并将其插入数据库。

如果需要,我可以为模型和控制器提供代码。

1 个答案:

答案 0 :(得分:1)

您想要"fake" Ruby's through association with CakePHP.

为什么这样做超过HABTM?

因为您想保存有关关联的数据。使用Cake的HABTM保存关于关联的数据很困难,因为你真正拥有的只有一个JOIN表。你需要比这更强大的东西。

首先,摆脱模型中的$hasAndBelongsToMany属性。接下来,我们将您的release_server_to_components表格重新命名为“直通”表格。

因此,在ReleaseComponentReleaseServer模型中,您会有这样的关联:

$hasMany = array('ReleaseServerToComponent');

现在,在您的新ReleaseServerToComponent模型中,您将拥有这样的关联:

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

现在,您可以像普通的Cake模型一样访问此表,即$this->ReleaseServer->ReleaseServerToComponent->find()。您可以在直通表中添加其他字段,例如server_component_name。您已经拥有具有release_server_to_components表主键的特定服务器组件的唯一标识符。

您可以使用Cake's saveAll() method保存此数据。或者,您可以生成自己的数据进行保存,只需从表单字段中插入服务器ID和组件ID即可。在该链接的顶部是将传递给模型的保存方法时保存的数据格式。