Can
Be Better

ThinkPHP关联模型

关联模型,如果手册一次看不懂的话,那就再看一次,如果看了N多遍还是没看懂,那就动手操作吧。

ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个例子.让大家理解ThinkPHP关联模型的意思.

环境描述:公司有一个员工表think_user,一个档案表,think_archives,一个部门表,think_department,和一个银行卡表.think_cars.

一个员工只有一个档案表,所以关系就是HSA_ONE,

一个员工只属于一个部门,但是部门里有多个员工,所以是BELONGS_TO关系

一个员工有多个银行卡,但是一个银行卡只能属于一个员工.所以关系就是HAS_MANY.

先创建需要的表和测试数据

用户表

CREATE TABLE `think_user` (  
`id` mediumint(6) NOT NULL auto_increment,  
`name` varchar(25) NOT NULL,  
`dept_id` smallint(3) NOT NULL,  
PRIMARY KEY  (`id`)  
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;

用户档案表

CREATE TABLE `think_profile` (  
`id` mediumint(6) NOT NULL auto_increment,  
`user_id` mediumint(6) NOT NULL,  
`email` varchar(255) NOT NULL,  
`nickname` varchar(50) NOT NULL,  
PRIMARY KEY  (`id`)  
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;

银行卡表

CREATE TABLE `think_card` (  
`id` mediumint(6) NOT NULL auto_increment,  
`user_id` mediumint(6) NOT NULL,  
`card` varchar(25) character set latin1 NOT NULL,  
PRIMARY KEY  (`id`)  
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;

项目组表

CREATE TABLE  `think_group` (  
`id` mediumint(6) NOT NULL auto_increment,  
`name` varchar(50) NOT NULL,  
PRIMARY KEY  (`id`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

用户-项目组表

CREATE TABLE  `think_group` (  
`id` mediumint(6) NOT NULL auto_increment,  
`name` varchar(50) NOT NULL,  
PRIMARY KEY  (`id`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE `think_user_group` (  
`id` mediumint(6) NOT NULL auto_increment,  
`group_id` mediumint(5) NOT NULL,  
`user_id` mediumint(5) NOT NULL,  
PRIMARY KEY  (`id`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

下面我们分别来给数据表定义对应的模型,这里关键是用户模型的定义,因为我们以用户表为核心来定义和使用关联,所以其他模型中无需再定义关联关系。

class UserModel extends Model  
{  
protected $_link = array(  
‘Profile’=>HAS_ONE,  
‘Dept’=>BELONGS_TO,  
‘Card’=>HAS_MANY,  
‘Group’=>MANY_TO_MANY,  
);  
}

上面的关联定义,我们采用了最简洁的定义方式,也就是所有规则都按照系统的默认规则进行。这些规则包括主键、外键、表名的规范。完整的关联定义可以写成:

class UserModel extends Model  
{  
protected $_link = array(  
‘Profile’=>array(  
‘mapping_type’=>HAS_ONE,  
‘mapping_name’=>’Profile’,  
‘class_name’=>’Profile’,  
‘foreign_key’=>’user_id’,  
),  
‘Dept’=> array(  
‘mapping_type’=> BELONGS_TO,  
‘mapping_name’=>’Dept’,  
‘class_name’=>’Dept’,  
‘foreign_key’=>’dept_id’,  
),  
‘Card’=> array(  
‘mapping_type’=> HAS_MANY,  
‘mapping_name’=>’Card’,  
‘class_name’=>’Card’,  
‘foreign_key’=>’user_id’,  
),  
‘Group’=> array(  
‘mapping_type’=> MANY_TO_MANY,  
‘mapping_name’=>’Group’,  
‘class_name’=>’Group’,  
‘foreign_key’=>’user_id’,  
‘relation_foreign_key’=>’group_id’,  
‘relation_table’=>’think_user_group’,  
),  
);  
}

注意:HAS_ONE 这是主动关联,外键必须是被关联的表;BELONGS_TO 这是被动关联,外键必须是被关联的表,也就是本表。 关联模型,以我的理解,比如user表中的dept_id 与之关联的是dept表中的id。其实最关键的还是动手实践一下,比如HAS_ONE、HAS_MANY 其中的区别。其他的参照手册:http://doc.thinkphp.cn/manual/relation_model.html

赞(0) 打赏
不开启评论,如有问题疑问请发邮件。[email protected]最长的路 » ThinkPHP关联模型
分享到: 更多 (0)