thinkPHP--SQL连贯操作
一.连贯入门 连贯操作使用起来非常简单,比如查找到 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连贯操作的更多相关文章
- SQL 连贯操作 [1]
一. 连贯入门 查找到 id 为 1,2,3,4 中按照创建时间的倒序的前两位. 在 Home/controller/UserController.class.php 下插入 1.连贯操作入门 $us ...
- SQL 连贯操作 [2]
1.alias 用于设置数据表别名 $user = M('User'); var_dump($user->alias('anothername')->select()); 这时在SQL中的 ...
- ThinkPHP框架模型连贯操作(八)
原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...
- ThinkPhp 3.2 数据的连贯操作
ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...
- 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句
如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true) ...
- ci连贯操作的limit两个参数和sql是相反的
ci连贯操作的limit两个参数和sql是相反的 db->where("name =",'mary')->ge() name后面要有个空格否则报错当为一个字段 -> ...
- ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)
1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...
- ThinkPHP - 连贯操作
/** * 连贯操作 * @return 无返回值 */ public function coherentOperation(){ //实例化模型 $user = M('User'); // +--- ...
- 11.ThinkPHP 3.1.2 连贯操作
==================================================== 一.常用连贯操作 1.where 帮助我们设置查询条件 2.order 对结果进行排序 $ar ...
- thinkphp 3.2 部分数据库连贯操作phpstorm helper 文件
<?php class Helper { /** * 用于设置数据写入和查询是否严格检查是否存在字段. * 默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常 * 如: * str ...
随机推荐
- 富文本编辑器防止xss注入javascript版
富文本编辑器:ueditor 其实富文本编辑器已经有防止xss注入功能,但是你服务端程序在接收的时候在做一次转义,否则有可能然后前端验证直接提交数据导致被xss攻击. 为了节省后端程序开销则在前端 显 ...
- winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难
// winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ...
- CG Rendering v.s. Browser Rendering
浏览器的渲染技术 v.s. CG渲染器的渲染技术 看了两篇文章: 浏览器的渲染原理简介, How browsers work(译文), 想到了一些东西, 对比两者, 或许有些东西能想得更明白些. 以下 ...
- 去掉mac终端里面hostname提示处的bogon
打开终端,如果在命令提示$前面显示的主机名变成了bogon,则可以通过命令行修改: sudo scutil --set hostname 新主机名
- javascript基础部分
javascript基础部分 1 数据类型: 基础数据类型(通过typeof来检测):Number,string,undefined,null,boolean,function typeof只能检测 ...
- 数据库schema设计与优化
原文地址 1. 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分,自然也是我们花费精力最多的部 ...
- php类中常量的定义
先看下面一段代码: class SVN { const DEFAULT_PATH = "/tmp"; const SVNLOOK_CMD = "/usr/bin/svnl ...
- sqlite升级--浅谈Android数据库版本升级及数据的迁移
Android开发涉及到的数据库采用的是轻量级的SQLite3,而在实际开发中,在存储一些简单的数据,使用SharedPreferences就足够了,只有在存储数据结构稍微复杂的时候,才会使用数据库来 ...
- web app开发之rem
CSS3新增了一个相对单位rem,官方的解释为“font size of the root element”,相对于根元素(html)的font size. rem,em,px单位的区别: rem单位 ...
- 在MyBook Live上部署svn
一直以来都在用svn管理源代码,美中不足的是由于svn服务器端部署在本地,无法实现在异地迁入迁出程序,因此考虑将svn服务器部署在我的MyBook Live上. 一.部署svn 1.分别执行以下2条命 ...