thinkphp 3.2关联查询
首先,我们来盲定义几个表!
1、用户表:
创建表“用户”(
` id ‘ int(11)NOT NULL auto _ increment,
` username ‘ varchar(20)默认为NULL,
` password ‘ varchar(20)默认为NULL,
主键(` id `)
)ENGINE=InnoDB AUTO_INCREMENT=4默认字符集=utf8
2.用户信息表:用户信息:
创建表` userinfo `(
` id ‘ int(11)NOT NULL auto _ increment,
` user_id` int(11)不为空,
` phone ‘ varchar(22)默认为NULL,
` addirss` varchar(150)默认为NULL,
` age ‘ varchar(10)默认值为NULL,
` sex ‘ varchar(10)默认为NULL,
主键(` id `)
)ENGINE=InnoDB AUTO_INCREMENT=4默认字符集=utf8
3.用户申请表:
创建表“userapp ”(
` id ‘ int(11)NOT NULL auto _ increment,
` user_id` int(11)不为空,
` app_name` varchar(20)默认为NULL,
` app_info ‘文本,
主键(` id `)
)ENGINE=InnoDB AUTO_INCREMENT=16默认字符集=utf8
说说三块表的关系吧,
用户表(user)和(userinfo)的关系:每个用户只对应一个用户信息,所以是一对一的关系HAS_ONE。
用户表(user)和(userapp)的关系:每个用户可以对应多个应用,所以是一对多关系HAS_MANY。
我们想达到一个效果,就是查询它对应的每个用户的信息,以及它所有的应用。下面就来看看怎么实现吧!
首先,建立两者之间的对应关系:
在thinkphp中,变量$_link用于定义关系,例如:public $ _ link = array();就写他们的通信吧!
首先建立控制器:UserAction.class.php。
在构建相应的模型:UserModel.class.php时,这个模型必须继承RelationModel类。
类用户模型扩展关系模型{
public $_link = array(
//一对一的关系
'userinfo & # 39= & gt数组(
'mapping _ type & # 39= & gtHAS_ONE,//被定义为一对一的关系
'class _ name & # 39= & gt'Userinfo & # 39
),
//一对多关系
'userapp & # 39= & gt数组(
'mapping _ type & # 39= & gtHAS_MANY,//定义为一对多关系
'class _ name & # 39= & gt'Userapp & # 39,//对应模型的类名
'foreign _ key & # 39= & gt'user _ id & # 39,//对应的外键ID
'mapping _ name & # 39= & gt'Userapp & # 39,//获取值的名称
//'映射_顺序& # 39;= & gt'创造时间desc & # 39;,
)
);
}
就这么简单。我们来看看如何查询数据!
写在控制器里,也就是在动作里。
类UserAction扩展操作{
//一对一一对多联查
公共函数索引(){
$ User = D(& quot;用户& quot);
$ u = $ User-& gt;关系(真)-& gt;findAll();
//dump($ u);
$ this-& gt;分配(& # 39;u & # 39,$ u);
$ this-& gt;显示(& # 39;index & # 39);
}
}
好了,就这样吧!
补充一点:需要建立userinfo表和userapp的模型名,例如:UserInfo:UserinfoModel.class.php。
怎么样配置thinkphp与本地mysql和sqlserver同时连接俩个数据库?
thinkphp 同时连接两个数据库的配置方法如下:
1、在Db.class.php脚本文件里面的类增加一个魔术方法__get(),写法如下:public function __get($propertyName){ return $this->$propertyName;}这个方法是用来访问类中protected $config成员属性用的。有的人可能会说,直接把protected改成public岂不是更好。这样只解决了基类的问题,假如,子类也同样进行了受保护,那要你更改更多的文件,这是我们做IT程序员非常不愿意看到的事情。
2、在Model.class.php中的getTableName()方法更改如下:$tablepre = $this->db->config;if(empty($this->trueTableName)) {$tableName??= empty($tablepre) ? $this->tablePrefix : $tablepre;if(!empty($this->tableName)) {$tableName .= $this->tableName;}else{$tableName .= parse_name($this->name);}$this->trueTableName? ? =? ?strtolower($tableName);}return (!empty($this->dbName)?$this->dbName.’.’:”).$this->trueTableName;这样就完成了多库自由切换时,导致的表前缀问题。/*******************面向对象PDO连接方式*********************/’DB_TYPE’ => ‘PDO’, // 数据库类型’DB_DSN’ => ‘mysql:host=localhost;dbname=master’, // DSN连接。’DB_USER’ => ‘root’, // 数据库用户名’DB_PWD’ => ‘123456’, // 数据库密码’DB_PORT’ => ‘3306’, // 数据库端口’DB_PREFIX’ => ‘g_’, // 数据表前缀’DB_CHARSET’ => ‘utf8’, // 数据库编码默认采用utf8
thinkphp 3.2.3在3.2.2基础上有哪些新特性?
3.2.3 主要更新
数据库驱动完全用PDO重写;
支持通用insertAll方法;
改进参数绑定机制;
主从分布式数据库连接改进;
对Mongo的支持更加完善;
模型类的诸多增强和改进;
增加聚合模型扩展;
支持复合主键;
多表操作的支持完善;
模型的CURD操作支持仅获取SQL语句而不执行;
增加using/index/fetchSql/strict/token连贯操作方法;
模型类的setInc和setDec方法支持延迟写入;
I函数增加变量修饰符和正则检测支持;
支持全局变量过滤和Action参数绑定的变量过滤;
修正可能的SQL注入漏洞;
支持全局路由定义;
增加插件控制器支持;
增加对全局和模块的模板路径的灵活设置;
日志目录分模块存放;
增加memcache Session驱动;
改进session函数的数组操作;