发新话题
打印

HABTM关系中关联表的自动填充

HABTM关系中关联表的自动填充

作者:老王

简单的多对多例子: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 ;

TOP

发新话题