thinkphp关联查询

By | 2013 年 03 月 29 日

首先,我们就瞎定义几张表吧!

1,user表:

CREATE TABLE user (
id int(11) NOT NULL auto_increment,
username varchar(20) default NULL,
password varchar(20) default NULL,
PRIMARY KEY  (id)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

2,用户信息表:userinfo:

CREATE TABLE userinfo (
id int(11) NOT NULL auto_increment,
user_id int(11) NOT NULL,
phone varchar(22) default NULL,
addirss varchar(150) default NULL,
age varchar(10) default NULL,
sex varchar(10) default NULL,
PRIMARY KEY  (id)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

3,用户应用表:

CREATE TABLE userapp (
id int(11) NOT NULL auto_increment,
user_id int(11) NOT NULL,
app_name varchar(20) default NULL,
app_info text,
PRIMARY KEY  (id)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8

说说三个表之间的关系吧,

用户表(user)和(userinfo)之间的关系:每个用户只对应一个用户信息,所以是一对一的关系HAS_ONE

用户表(user)和(userapp)之间的关系:每个用户可以对应多个应用,所以是一对多的关系HAS_MANY

我们要实现一个效果,就是查询是每个用户对应它的信息和它所有的应用,看看下面怎么实现吧!

第一:建立之间的对应关系:

         在thinkphp之中,定义关联关系得用$_link变量,例如:public $_link = array();就写写他们的对应关系吧!

         先建立控制器:UserAction.class.php
         在建立对应模型:UserModel.class.php,这个得继承RelationModel类
class UserModel extends RelationModel {     

public $_link = array (
 //一对一关系
 ‘userinfo’ => array (
  ‘mapping_type’ => HAS_ONE, //定义为一对一关系
  ‘class_name’ => ‘Userinfo’
 ),
 
 //一对多关系
 ‘userapp’=>array(
  ‘mapping_type’ =>HAS_MANY,//定义为一对多关系
  ‘class_name’=>’Userapp’,//对应的Model的类名
           ‘foreign_key’=>’user_id’, //对应的外键ID
           ‘mapping_name’=>’Userapp’, //获取值的名称
           //’mapping_order’=>’create_time desc’,
 )
);

}

就这么简单,看看怎么把数据查询出来吧!

在控制器中  也就是action中写

 

class UserAction extends Action{
//一对一 一对多 关联查询
public function index(){
 $User = D(“User”);
 $u = $User->relation(true)->findAll();
 //dump($u);
 $this->assign(‘u’,$u);
 $this->display(‘index’);
}
}

OK就这样完成了!

 

补充一点:就是必须建立userinfo表和userapp的模型模型名称和表名一致,例如:userinfo:UserinfoModel.class.php

发表评论

电子邮件地址不会被公开。 必填项已用*标注