作者:老王
简单的多对多例子:Thread hasAndBelongsToMany Tag,假设我们希望在保存Thread的时候,自动填充Thread和Tag的关联表(tags_threads),所需步骤如下:
复制内容到剪贴板
代码:
class ThreadsController extends AppController
{
// ...
function save()
{
// $this->data['Thread']['field'] ...
$this->data['Tag']['Tag'] = array(10, 20, 30, 40); // tag的id数组
$this->Thread->save($this->data); // 如此在保存Thread的时候就会自动天从关联表了。
}
}后记:类似$this->data['Tag']['Tag']的形式多少看着有些别扭,不知道当初
Cakephp的
开发者为啥这么设计。此外,在填充关联表前,Cakephp会先Delete所有相关的行,然后在Insert,这样的方法实现起来最简单,但是如果我们的关联表不止两个外键
字段,还要保存额外的信息,那么这样的操作会出问题。
附:
复制内容到剪贴板
代码:
CREATE TABLE `tags` (
`id` int(10) unsigned NOT NULL auto_increment COMMENT '标签的标识',
`name` varchar(255) NOT NULL COMMENT '标签的名字',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='标签表' AUTO_INCREMENT=1 ;
CREATE TABLE `tags_threads` (
`tag_id` int(10) unsigned NOT NULL COMMENT '标签的标识',
`thread_id` int(10) unsigned NOT NULL COMMENT '文章的标识',
PRIMARY KEY (`tag_id`,`thread_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='标签表和文章表的关联表';
CREATE TABLE `threads` (
`id` int(10) unsigned NOT NULL auto_increment COMMENT '文章的标识',
`name` varchar(255) NOT NULL COMMENT '文章的标题',
`author` varchar(255) NOT NULL COMMENT '文章的作者',
`is_source` tinyint(1) unsigned NOT NULL COMMENT '文章是否原创',
`source_name` varchar(255) NOT NULL COMMENT '文章的来源名称',
`source_link` varchar(255) NOT NULL default '' COMMENT '文章的来源链接',
`created_time` int(10) unsigned NOT NULL COMMENT '文章的创建时间',
`updated_time` int(10) unsigned NOT NULL default '0' COMMENT '文章的更新时间',
`passed_time` int(10) unsigned NOT NULL default '0' COMMENT '文章的审核时间',
`comments_number` int(10) unsigned NOT NULL default '0' COMMENT '文章的评论数',
`has_picture` tinyint(1) unsigned NOT NULL default '0' COMMENT '文章是否有图示',
`introduction` varchar(255) NOT NULL COMMENT '文章的介绍',
`user_id` int(10) unsigned NOT NULL COMMENT '文章的编辑的标识',
`column_id` int(10) unsigned NOT NULL COMMENT '文章栏目的标识',
`category_id` int(10) unsigned NOT NULL COMMENT '文章类别的标识',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='文章表' AUTO_INCREMENT=1 ;