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 ...
随机推荐
- Java Junit单元测试
使用Junit进行单元测试,首先引入Junit的jar,配置如下. @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(&quo ...
- SerializableDictionary-一个支持序列化与反序列化的Dictionary
使用Dictionary存储的信息在试图序列化为XML保存到文件时,会遇到无法序列化的问题,由于官方Dictionary不支持xml序列化,所以有朋友已经通过实现IXmlSerializable接口, ...
- oracle基础教程(8)oracle修改字符集
oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...
- crontab服务详解(任务计划)
crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 servi ...
- Uva11292--------------(The Dragon of Loowater)勇者斗恶龙 (排序后贪心)
---恢复内容开始--- 题目: Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major ...
- mybatis实战教程(mybatis in action)之六:与Spring MVC 的集成
前面几篇文章已经讲到了mybatis与spring 的集成.但这个时候,所有的工程还不是web工程,虽然我一直是创建的web 工程.今天将直接用mybatis与Spring mvc 的方式集成起来,源 ...
- 很不错的在线Office控件:IWebOffice与SOAOffice
http://blog.csdn.net/cjh200102/article/details/17220441 iWebOffice2003文档控件 iWebOffice2003网络文档中间件能够在I ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- mongodb高级查询
前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客 MongoDB下载安装与简单增删改查 前奏:启 ...
- 禁用Windows窗体的关闭按钮
1. protected override void OnFormClosing(FormClosingEventArgs e) { e.Cancel = true; base.OnFormClosi ...