我有两张桌子: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
我想要添加的是具有系统ID的能力 - 该系统ID将是服务器上的每个组件(不是每个服务器而不是每个组件,而是每个服务器上的组件)。我希望能够轻松地为每个组件添加系统ID并将其插入数据库。
如果需要,我可以为模型和控制器提供代码。
答案 0 :(得分:1)
您想要"fake" Ruby's through association with 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()
method保存此数据。或者,您可以生成自己的数据进行保存,只需从表单字段中插入服务器ID和组件ID即可。在该链接的顶部是将传递给模型的保存方法时保存的数据格式。