+ -
当前位置:首页 → 问答吧 → 如何建立多对多关联表

如何建立多对多关联表

时间:2010-08-08

来源:互联网

tp里面多对多关系,想建立一个关联表
【日志表】 tp_post :post_id    ,title
【标签表】tp_tag:tag_id ,tagname
【中间表】tp_post_tag:  post_id ,tag_id

想通过中间表把tp_post表和tp_tag表关系起来!
可能实现当插入日志时,把日志标题、日志标签一起插入!

作者: hsxuguang   发布时间: 2010-08-08

MANY_TO_MANY

MANY_TO_MANY 关联表示当前模型可以属于多个对象,而父对象则可能包含有多个子对象,通常两者之间需要一个中间表类约束和关联。例如每个用户可以属于多个组,每个组可以有多个用户:

'Group'=> MANY_TO_MANY

完整定义方式为:

        array(    'mapping_type'=>MANY_TO_MANY,

                    'class_name'=>'Group',

                    'mapping_name'=>'groups',

                    'foreign_key'=>'userId',

                    'relation_foreign_key'=>'goupId',

                    'relation_table'=>'think_gourpUser')



MANY_TO_MANY支持的关联属性定义有:

class_name要关联的模型类名

mapping_name 关联的映射名称,用于获取数据用

该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。

foreign_key关联的外键名称

外键的默认规则是当前数据对象名称_id,例如:

relation_foreign_key关联表的外键名称

默认的关联表的外键名称是表名_id

mapping_limit关联要返回的记录数目

mapping_order关联查询的排序

relation_table多对多的中间关联表名称

多对多的中间表默认表规则是:数据表前缀_关联操作的主表名_关联表名

如果think_user 和 think_group 存在一个对应的中间表,默认的表名应该是

如果是由group来操作关联表,中间表应该是 think_group_user,如果是从user表来操作,那么应该是think_user_group,也就是说,多对多关联的设置,必须有一个Model类里面需要显式定义中间表,否则双向操作会出错。

中间表无需另外的id主键(但是这并不影响中间表的操作),通常只是由 user_id 和 group_id 构成。

默认会通过当前模型的getRelationTableName方法来自动获取,如果当前模型是User,关联模型是Group,那么关联表的名称也就是使用 user_group这样的格式,如果不是默认规则,需要指定relation_table属性。

作者: flyfishiii   发布时间: 2010-08-10

2 楼   

作者: zhong21jia   发布时间: 2011-07-26