ThinkPHP视图查询详解
ThinkPHP提供的视图查询应用功能十分强大,用户利用视图查询功能可以将多个数据表的字段内容按需要进行指定和筛选,组织成一个基于这些数据表的视图模型,然后就可以通过该模型直接进行多表联合查询,非常方便和简单。
例如在项目中,我们定义有三个表:
user 用户基础表,
user_info 用户详细信息表,
dept 部门分类表
现在我们需要获取某个用户信息,
该信息要包括用户的帐号名称和相关资料与及所在部门的名称,
这时候我们可以利用视图查询进行处理。
下面举例加以说明:
1.构建一个新项目并进行相关配置(可参考前面的教程,这里省略)
2.创建一个数据库tpview,并添加这三个表
(1) 用户表
1
2
3
4
5
6
7
8
9
10
|
CREATE TABLE `think_user` (
`id` int (11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID编号' ,
` name ` varchar (20) NOT NULL COMMENT '帐户' ,
` password ` varchar (32) NOT NULL COMMENT '密码' ,
`dept_id` smallint (6) unsigned NOT NULL ,
`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '开放状态' ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT= '会员表' AUTO_INCREMENT=2 ;
INSERT INTO `think_user` (`id`, ` name `, ` password `, `dept_id`, `status`) VALUES
(1, 'zzguo28' , '123456' , 2, 1);
|
(2)用户信息表
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE TABLE `think_user_info` (
`user_id` int (11) NOT NULL COMMENT '用户id' ,
`nick_name` varchar (30) NOT NULL COMMENT '用户昵称' ,
`email` varchar (100) NOT NULL COMMENT '邮箱地址' ,
`address` varchar (100) NOT NULL COMMENT '详细地址' ,
`gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别' ,
`mobile` varchar (100) NOT NULL COMMENT '手机号码' ,
`telephone` varchar (100) NOT NULL COMMENT '电话号码' ,
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT= DYNAMIC COMMENT= '用户信息表' ;
INSERT INTO `think_user_info` (`user_id`, `nick_name`, `email`, `address`, `gender`, `mobile`, `telephone`) VALUES
(1, '国' , 'zzguo28@163.com' , 'TP路think街1.6号' , 1, '12345678901' , '123456' );
|
(3) 部门分类表
1
2
3
4
5
6
7
8
9
|
CREATE TABLE `think_dept` (
`id` smallint (3) NOT NULL AUTO_INCREMENT,
` name ` varchar (50) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
INSERT INTO `think_dept` (`id`, ` name `) VALUES
(1, '开发部' ),
(2, '销售部' ),
(3, '财务部' );
|
3.在项目/Lib/Model下创建这三个表的基础模型Model
本示例没涉及到验证等其它功能,所以只要简单定义测可,例如
1
2
3
4
|
<?php class UserModel extends Model {
}
?> |
其实视图模型对应的数据表并非一定要有相应的的基础模型,但是建议您创建,这样单表和视图都可以操作。
4.创建视图模型,代码如下,详细注解见其后:
(附注:最新svn上已增加动态扩展模型功能,使用新版需要将protected属性改为public属性,建议使用动态扩展功能去使用视图查询,而不再是本教程的继承方式。那样使用会更灵活。)
1
2
3
4
5
6
7
8
9
10
|
<?php import( 'ViewModel' );
class UserViewModel extends ViewModel{
protected $viewFields = array (
'User' => array ( 'id' , 'name' , '_as' => 'u' , '_type' => 'left' ),
'UserInfo' => array ( 'email' , 'mobile' , '_as' => 'ui' , '_on' => 'ui.user_id=u.id' ),
'Dept' => array ( 'name' => 'dept' , '_on' => 'u.dept_id=Dept.id' ),
);
} ?> |
对上述代码解释如下:
在第2行代码中,由于自TP1.6版开始已将视图查询分离出原Model类,因此这里需要使用import方法引入了视图模型类。
第3行代码中,定义了该模型名称为UserViewModel,视图模型的名称Model前的命名是随意的,只是为了有别于其它模型,通常我们会以xxxViewModel这样的方式去命名。并且一定要继承ViewModel。(ThinkPHP1.6版无需再设置模型的viewModel属性为true,只要继承ViewModel则可)
第4行代码$viewFields 属性表示视图模型包含的字段,每个元素定义了各个数据表或者模型所需的字段。
格式是
1
2
3
|
protected $viewFields = array (
'表名' => array ( '所需字段' , '_as' => '别名定义' , '_on' => '筛选条件' , '_type' => '指定join类型,支持right,inner,left三种' ),
); |
注意到第7行代码中的'name'=>'dept',因为User模型里面已经存在了一个name字段,所以我们通过这种方式把Dept模型的name字段映射为dept字段,如果有多个字段,可以使用同样的方式添加。
定义完毕后,我们在Action中进行测试,代码如下
1
2
3
4
5
6
7
8
9
10
|
<?php class IndexAction extends Action{
public function index(){
$dao = D( 'UserView' );
$where [ 'u.id' ] = 1;
dump( $dao ->where( $where )->find());
dump( $dao ->getLastSql());
}
} ?> |
然后访问该操作,可以看到我们成功取得所需的查询内容:
1
2
3
4
5
6
7
8
9
|
array (1) {
[0] => array (5) {
[ "id" ] => string(1) "1"
[ "name" ] => string(7) "zzguo28"
[ "email" ] => string(17) "zzguo28@163.com"
[ "mobile" ] => string(11) "12345678901"
[ "dept" ] => string(9) "销售部"
}
} |
并可以看到使用的sql如下
1
|
"SELECT u.id AS id,u.name AS name,ui.email AS email,ui.mobile AS mobile,Dept.name AS dept FROM think_user u LEFT JOIN think_user_info ui ON ui.user_id=u.id JOIN think_dept Dept ON u.dept_id=Dept.id WHERE ( u.id = 1 ) LIMIT 1 " |
视图模型在查询上和普通单表并没有多大分别,可以使用我们所熟悉的各种连贯操作,例如order,limit等等。
ThinkPHP视图查询详解的更多相关文章
-
Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
-
ElasticSearch第四步-查询详解
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
-
Solr安装入门、查询详解
Solr安装入门:http://www.importnew.com/12607.html 查询详解:http://www.360doc.com/content/14/0306/18/203871_35 ...
-
MySQL简单查询详解-单表查询
MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...
-
(转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
-
【转载】D3DXMatrixLookAtLH视图变换函数详解
原文:D3DXMatrixLookAtLH视图变换函数详解 /*D3DXMatrixLookAtLH函数返回的是世界->视图变换矩阵. 视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的 ...
-
分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
-
ThinkPHP视图查询
ThinkPHP视图查询 一.总结 1.这里的视图查询和多表查询很像,当然多表查询的话肯定要支持左右链接查询 2.view:视图的使用,关键字是view 3.sql视图功能支持:thinkphp支持视 ...
-
Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
随机推荐
-
开源项目GitHub
GitHub 手把手教你如何加入到github的开源世界! http://www.open-open.com/lib/view/open1396580186465.html 如何在 Github 上发 ...
-
今天接触枚举类型,感觉是C里面应该才有的东西
遍历枚类型的方法: public static EActChannel getEnumByCode(int code) { for (EActChannel enm : EActChannel.val ...
-
发布Restful服务时出现IIS 指定了身份验证方案错误时的解决方案(IIS specified authentication schemes)
发布RESTful服务,当访问.svc文件时出现如下错误时: IIS 指定了身份验证方案“IntegratedWindowsAuthentication, Anonymous”,但绑定仅支持一种身份验 ...
-
前端笔试题 JS部分
题目 http://www.itmian4.com/forum.php?mod=viewthread&tid=4540 http://www.itmian4.com/forum.php?mod ...
-
java中如何设置下载文件
如果想要设置某一url为下载文件的方法如下 需要设置文件响应类型,使用response.setContentType,比如jpeg格式的图片.如果想要访问该页面时出现下载保存的窗口,使用respons ...
-
jQuery事件篇---高级事件
内容提纲: 1.模拟操作 2.命名空间 3.事件委托 4.on.off 和 one 发文不易,转载请注明出处! 一.模拟操作 在事件触发的时候,有时我们需要一些模拟用户行为的操作.例如:当网页加载完毕 ...
-
php如何互换一个数组的首尾元素 中间不变 首尾互换
群里有人提出一个问题 如何互换一个数组的首尾元素 中间不变 首尾互换 代码如下: <?php $array=array(1,2,3,4,5,6,7,8,9,10); $first=array_s ...
-
APP接口基础学习一
PHP面向对象思想 1.客户端发送http请求到达服务器 2.服务器做出响应返回数据(XML,JSON或者其他)到达客户端 XML与JSON 的区别 1.可读性:xml胜出 2.生成数据:json胜出 ...
-
TFS二次开发-基线文件管理器(1)-设计
CMMI在做基线文件管理的时候,常常是需要记录一部分基线文件的版本.并且这个基线文件记录也需要进行版本控制.TFS在做这件事的时候一般来说会选用标签(Lable)来做一系列文件的版本记录. 但是我发现 ...
-
vue快速入门(二)
工程搭建完成,接下来如何使用. 首先找到src\rooter\index.js文件 这里是路由文件配置要访问的组件,这个会在后期说明 这里的components/A 是组件里边的 需要手动 创建A.v ...