一.连贯入门 连贯操作使用起来非常简单,比如查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两 位。

//连贯操作入门 $user = M('User'); var_dump($user->where('id in (1,2,3,4)')->order('date DESC')->limit(2)->select());

PS:这里的 where、order 和 limit 方法都是连贯操作方法,所以它们都能返回$user 本身,可以互换位置。

而 select 方法不是连贯方法,需要放在最后,用以显示数据集。

//数组操作 $user = M('User'); var_dump($user->select(array('where'=>'id in (1,2,3,4)', 'limit'=>'2', 'order'=>'date DESC')));

//CURD处理,CURD会在专门章节讲解

$user = M('User'); var_dump($user->where('id=1')->find()); var_dump($user->where('id=7')->delete());

系统支持的连贯方法 连贯操作 作用 支持的参数类型

where* 用于查询或者更新条件的定义 字符串、数组和对象

table 用于定义要操作的数据表名称字符串和数组

alias 用于给当前数据表定义别名 字符串

data 用于新增或者更新数据之前的数据对 象赋值 数组和对象

field 用于定义要查询的字段(支持字段排 除) 字符串和数组

order 用于对结果排序 字符串和数组

limit 用于限制查询结果数量 字符串和数字

page 用于查询分页(内部会转换成 limit) 字符串和数字

group 用于对查询的 group 支持 字符串

having 用于对查询的 having 支持 字符串

join* 用于对查询的 join 支持 字符串和数组

union* 用于对查询的 union 支持 字符串、数组和对象

distinct 用于查询的 distinct 支持 布尔值

lock 用于数据库的锁机制 布尔值

cache 用于查询缓存 支持多个参数

relation 用于关联查询(需要关联模型支持) 字符串

result 用于返回数据转换 字符串

validate 用于数据自动验证 数组

auto 用于数据自动完成 数组

filter 用于数据过滤 字符串 scope* 用于命名范围 字符串、数组 bind* 用于数据绑定操作 数组或多个参数 token 用于令牌验证 布尔值 comment 用于 SQL 注释 字符串

PS:带*号的可以多次调用。

本节课没有讲到的连贯方法,会在其他章节探讨。

二.连贯方法

1.where where 方法支持字符串条件、数组条件(推荐用法)和多次调用。

//字符串方式 $user = M('User'); var_dump($user->where('id=1')->select());

//索引数组方式 $user = M('User'); $map['id'] = 1;

//使用表达式array('eq', 1); var_dump($user->where($map)->select());

//多次调用方式 $user = M('User'); $map['id'] = array('eq', 1); var_dump($user->where($map)->where('user="蜡笔小新"')->select());

2.order order 用于对结果集排序。

//倒序 $user = M('User'); $map['id'] = array('eq', 1); var_dump($user->order('id desc')->select());

//正序默认或 ASC //第二排序 var_dump($user->order('id desc,email desc')->select());

PS:先按 id 倒序,再按 email 倒序 //数组形式防止字段和mysql关键字冲突

$user = M('User');

$map['id'] = array('eq', 1);

var_dump($user->order(array('id'=>'DESC'))->select());

3.feild feild 方法可以返回或操作字段,可以用于查询和写入操作。

//只显示id和user两个字段 $user = M('User'); var_dump($user->field('id, user')->select());

//使用SQL函数和别名 $user = M('User'); var_dump($user->field('SUM(id) as count, user')->select());

//使用数组参数结合SQL函数 $user = M('User'); var_dump($user->field(array('id','LEFT(user,3)'=>'left_user'))->sele ct());

//获取所有字段 $user = M('User'); var_dump($user->field()->select());

//可以传入*号,或者省略方法 //用于写入 $user = M('User'); $user->field('user,email')->create();

//CURD 将在专门的章节学习

3.limit limit 方法主要用于指定查询和操作的数量。

//限制结果集数量 $user = M('User'); var_dump($user->limit(2)->select());
//分页查询 $user = M('User'); var_dump($user->limit(0,2)->select());

limit(0,2)中0表示从第几个开始,2表示每页显示条数。建议采用更为方便的page分页方法

//2,2、,4,2

4.page page 方法完全用于分页查询。

//page分页 $user = M('User');

var_dump($user->page(1,2)->select());

page方法非常方便,page(1,2)中,1代表第一页,2代表每页显示条数。

//2,2、3,2

5.table table 方法用于数据表操作,主要是切换数据表或多表操作。

//切换数据表 $user = M('User'); var_dump($user->table('think_info')->select());

//获取简化表名 $user = M('User'); var_dump($user->table('__USER__')->select());

注:若使用简化表名  要用大写,小写则无法执行;

//__INFO__尚可 //多表查询 $user = M('User'); var_dump($user->field('a.id,b.id')->table('__USER__ a,__INFO__ b')->select());

//多表查询,使用数组形式避免关键字冲突

$user = M('User'); var_dump($user->field('a.id,b.id')->table(array('think_user'=>'a', 'think_info'=>'b'))->select());

6.alias alias 用于设置数据表别名

//设置别名 $user = M('User'); var_dump($user->alias('a')->select());

7.group group 方法通常用于对结合函数统计的结果集分组。

//分组统计 $user = M('User'); var_dump($user->field('user,max(id)')->group('id')->select());

PS:group 会在 mysql 部分单独探讨。

8.having having 方法一般用于配合 group 方法完成从分组的结果中再筛选数据。

//分组统计结合having $user = M('User'); var_dump($user->field('user,max(id)')->group('id')->having('id>2')-> select());

PS:having 会在 mysql 部分单独探讨。

9.comment comment 方法用于对 SQL 语句进行注释

//SQL注释 $user = M('User'); var_dump($user->comment('所有用户')->select());

10.join join 方法用于多表的连接查询。

//JOIN多表关联,默认是INNER JOIN $user = M('User'); var_dump($user->join('think_user ON think_info.id = think_user.id')->select()); //__USER__和__INFO__代替 //RIGHT、LEFT、FULL var_dump($user->join('think_user ON think_info.id = think_user.id','RIGHT')->select());

PS:join 会在 mysql 部分单独探讨。

11.union union 方法用于合并多个 SELECT 的结果集

//合并多个SELECT结果集 $user = M('User'); var_dump($user->union("SELECT * FROM think_info")->select());

PS:union 会在 mysql 部分单独探讨。

12.distinct distinct 方法用于返回唯一不同的值

//返回不重复的列 $user = M('User'); var_dump($user->distinct(true)->field('user')->select());

13.cache cache 用于查询缓存操作

//查询缓存,第二次读取缓存内容 $user = M('User');

var_dump($user->cache(true)->select());

PS:第一次查询数据库,第二次查询相同的内容直接调用缓存,不用再查询数据库。

更多关于 cache 和缓存的使用方法,我们将在缓存那节详细探讨。

三.命名范围 命名范围其实就是将 SQL 语句封装在模型定义类里,而不在控制器里。

这样的分层操 作有利于代码的可读性,避免开发人员在写 CURD 操作时出现问题。

架构人员只要在命名范 围内合理的规划即可,类似于架构师架构了接口,让开发人员面向接口开发一样。

要使用命名范围,第一步要定义属性:

class UserModel extends Model { protected $_scope = array( //属性名必须是_scope 'sql1'=>array( 'where'=>array('id'=>1), ), 'sql2'=>array( 'order'=>'date DESC', 'limit'=>2, ), 'default'=>array( 'where'=>array('id'=>2), ), ); } 命名范围支持的属性有:where、field、order、table、limit、page、having、 group、lock、distinct、cache。
//调用命名范围 $user = D('User'); var_dump($user->scope('sql2')->select());

//支持调用多个scope方法 $user = D('User'); var_dump($user->scope('sql1')->scope('sql2')->select());

//default默认 $user = D('User'); var_dump($user->scope()->select());

//传递 default 也行 PS:如果传递不存在的命名范围,则忽略。

//对命名范围的SQL进行调整 $user = D('User'); var_dump($user->scope('sql2', array('limit'=>4))->select());

//直接覆盖命名范围 $user = D('User'); var_dump($user->scope(array('where'=>1,'order'=>'date DESC','limit'=>2))->select());

//直接用命名范围名调用 $user = D('User'); var_dump($user->sql2()->select());

thinkPHP--SQL连贯操作的更多相关文章

  1. SQL 连贯操作 [1]

    一. 连贯入门 查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两位. 在 Home/controller/UserController.class.php 下插入 1.连贯操作入门 $us ...

  2. SQL 连贯操作 [2]

    1.alias 用于设置数据表别名 $user = M('User'); var_dump($user->alias('anothername')->select()); 这时在SQL中的 ...

  3. ThinkPHP框架模型连贯操作(八)

    原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...

  4. ThinkPhp 3.2 数据的连贯操作

    ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...

  5. 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句

    如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...

  6. ci连贯操作的limit两个参数和sql是相反的

    ci连贯操作的limit两个参数和sql是相反的 db->where("name =",'mary')->ge() name后面要有个空格否则报错当为一个字段 -> ...

  7. ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)

    1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...

  8. ThinkPHP - 连贯操作

    /** * 连贯操作 * @return 无返回值 */ public function coherentOperation(){ //实例化模型 $user = M('User'); // +--- ...

  9. 11.ThinkPHP 3.1.2 连贯操作

    ==================================================== 一.常用连贯操作 1.where 帮助我们设置查询条件 2.order 对结果进行排序 $ar ...

  10. thinkphp 3.2 部分数据库连贯操作phpstorm helper 文件

    <?php class Helper { /** * 用于设置数据写入和查询是否严格检查是否存在字段. * 默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常 * 如: * str ...

随机推荐

  1. 格式化xml

    在程序代码开发过程中,我们可能有时候需要将xml报文进行格式化一下,整理了一下,大概有两种方法: public String formatXml(String inputXml){ SAXReader ...

  2. Mysql大量数据快速排序方案

    日常开发中经常需要对数据进行排序,通常可以讲数据库中的数据获取到后通过程序在内存中进行排序,但是这样排序需要将排序内容从数据库中查询到内容,同时使用程序算法进行排序,然后将排序结果更新入数据库,这样排 ...

  3. Hue

    Hue是一个开源的Apache Hadoop UI系统,由Cloudera Desktop演化而来,最后Cloudera公司将其贡献给Apache基金会的Hadoop社区,它是基于Python Web ...

  4. kylin(一): 原理架构

    由eBay开源的一个大数据OLAP框架,2014年11月加入了Apache,项目名字也改成了"Apache Kylin",Apache Kylin是唯一来自中国的Apache顶级开 ...

  5. 移动端 isScroll自定义实现

    var scroll_flag=null;var goodNum = 11;var i_c = 0;function loadInsuranceList(){ //这里写滚动出来 加载的数据$.aja ...

  6. mybatis实战教程(mybatis in action)之三:实现数据的增删改查

    前面已经讲到用接口的方式编程.这种方式,要注意的一个地方就是.在User.xml  的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.I ...

  7. 基于Bootstrap、Jquery的自适应导航栏

    css代码: .kch_nav{width: 100%; position: fixed;z-index: 999;top:0;left: 0;right: 0;height: 69px;backgr ...

  8. Linux下Tomcat服务器重启与关闭

    Linux下Tomcat重新启动 详细请参照原网站链接http://www.cnblogs.com/tovep/articles/2473147.html 在Linux系统下,重启Tomcat使用命令 ...

  9. MVC3升级为MVC4

    在程序包管理控制台输入 Install-Package UpgradeMvc3ToMvc4 等待 升级完成

  10. java和h5 canvas德州扑克开发中(一)

    先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...