ThinkPHP视图查询详解

ThinkPHP视图查询详解

参考http://www.jb51.net/article/51674.htm

这篇文章主要介绍了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, ‘国‘, ‘[email protected]‘, ‘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) "[email protected]"

  ["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等等。

时间: 2024-12-17 20:23:06

ThinkPHP视图查询详解的相关文章

ThinkPHP中视图模型详解.

很多TP的新手对于模型中的视图模型不甚了解,官方虽然有详细手册,但是对于初学者来说还是比较难以理解! 先简单说一下视图模型所能实现的功能,基本就是主表与副表之间各个字段的关联问题,实现多表关联查询,相对于使用原生SQL语句来说,着实是简单不少. 首先在数据表初始化的时候,用的不是传统的M('User'),在视图模型中使用的是D('UserView'),如下图: 需要主要的是几个单词的首字母大写. 之后在Lib/Model目录中新建名为XXXViewModel.class.php(XXX为任意控制

iOS开发——代码生成TabBar与视图切换详解

我在之前多篇博客中讲解了在不使用storyboard而使用nib文件的情况下,使用代码生成导航栏并进行跳转,具体可以参考<iOS开发--界面跳转与返回及视图类型详解><iOS纯代码实现界面建立.跳转.导航栏(无storyboard.无nib)(Objective-C)>.今天我来讲解下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转.代码示例已经上传至:https://github.com/chenyufeng1991/TabBarTest   . (1)

SpringMVC视图机制详解[附带源码分析]

目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本文将分析SpringMVC的视图这部分内容,让读者了解SpringMVC视图的设计原理. 重要接口和类介绍 1. View接口 视图基础接口,它的各种实现类是无

mysql简单的单表查询详解

mysql简单的单表查询详解 MySQL的查询操作: 单表查询:简单查询 多表查询:连续查询 联合查询: 选择和投影: 投影:挑选要显示的字段 选择:挑选符合条件的行 投影:SELECT 字段1, 字段2, ... FROM tb_name;  SELECT * FROM tb_name; 选择:SELECT 字段1, ... FROM tb_name WHERE 子句; 布尔条件表达式 mysql> CREATE TABLE students (SID INT UNSIGNED AUTO_IN

MySQL_05-Select查询详解

SQL查询详解 1.Orderby a) Order by 字段 asc | desc b) 允许多字段排序: 先按第一个字段排序,如果不能区分,再使用第二个字段排序:以此类推 2.Limit(限制获得的记录数量) a) 语法: limit offset, row_count  (offset:偏移量,下标从0开始:row_count:总记录数).例如:limit 2,3 表示从第二条开始,取三条(即第2条到第4条记录) 3.Distinct a) 去除重复记录. b) 语法: select d

sql语句联合查询详解

sql语句联合查询详解 2011-03-01 18:58:22|  分类: mysql|举报|字号 订阅 例子: person表和user表没有约束person表: user表: 有以下几种关联 1.UNION 格式:查询语句 UNION [ALL] 查询语句 [UNION [ALL] 查询语句][…n] 说明:ALL选项表示将所有行合并到结果集合中.不指定该项时,被联合查询结果集合中的重复行将只保留一行. 在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序.例

SQL常规查询详解

一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐式的交叉连接,没有cross join. select o.id, o.order_number, c.id, c.name from orders o , customers c where o.id=1; 语句2:显式的交叉连接,使用cross join. select o.id,o.order

Mybatis使用之查询详解

Mybatis使用之查询详解 一:简介 此篇主要知识点: 1.sql语句块 2.select标签属性 3.ResultMap 标签配置 4.一对一关联 5.一对多关联 6.多对多关联 7.嵌套查询 二:SQL语句块 2.1 作用 SQL元素可以被用来定义可重用的SQL 代码段,可以包含在其他语句中.比如在项目中常常做的分页查询.分别需要两条SQL语句.一条是查询所有具体记录信息.另一条需要查询记录数.而两条语句的where条件是一样的.这种类似情况就可以使用SQL语句块来简化配置信息. 2.2

分享知识-快乐自己:Hibernate 中Criteria Query查询详解

1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象. 在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Cr