thinkphp 3.2 关联查询

2025-03-01 04:16:41
推荐回答(1个)
回答1:

首先,我们就瞎定义几张表吧!
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