## CURD
* 开启 DEBUG 模式后,所有SQL语句均会在调试窗口显示,一目了然.
[TOC]
### find 单条查询
通过 find 操作进行简单的单条查询操作。
~~~
//查找主键值为 18 的记录
$db->find(18);
~~~
### all 查询(别名 select)
通过 all 查找所有记录数 。
~~~
//查找表中所有记录
$list = M('news')->all();
~~~
### table 临时改变表
通过 table() 方法可快速切换操作表
~~~
//改变操作表为 user
M('news')->table('user')->all();
~~~
### join 表关联
使用 join() 可以快速实现表间关联
~~~
//关联 user 表与 role 表
$data =M('user')->alias('u')->field('u.*')->join('__role__ r ON u.rid=r.rid')->all();
//生成的查询语句: select u.* from tb_user inner join tb_role r ON u.rid = r.rid;
~~~
### max 查找最大的值
查找年龄最大的用户
M('user')->max('age');
### min 查找最小的值
~~~
//查找最便宜的商品
M('goods')->min('price');
~~~
### avg 求平均值
~~~
//查找商品平均价格
M('user')->avg('price');
~~~
### sum 求和
~~~
//获得点击数之和
M('news')->sum('click')
~~~
### count 统计操作
~~~
//统计会员总数
M('user')->count()
~~~
### field 字段集
~~~
//返回字段为 uid 与 username
$db->field('uid,username')->select();
//以数组形式传参
$db->field(array('uid','username'))->select();
//更灵活的传参
$db->field(array('uid','concat(username,"-",uid)'=>'userid','LEFT(username,7)'=>'name'))- >select();
//上面生成SQL: SELECT uid,concat(username,"-",uid) AS userid,LEFT(username,7) AS name FROM tb_user
~~~
### 字段排除
~~~
//获得除 content,title 以外的所有字段
M('news')->field(array('title','content'),true)->all();
~~~
### limit 取部分数据
limit 方法就是为了生成 SQL 的 limit 部分
~~~
//查找第 2 条记录开始的 5 条记录
$db->limit('2,5')->all();
~~~
### order 排序
按 id 从大到小排序
$db->order('id desc')->all();
### getField 获得指定字段值
按字段名获得结果的方法
~~~
//获取唯一字段值值
//无论结果有多少个只返回一个值
$db->where('id=32')->getField('title');
~~~
~~~
//满足条件记录的所有 title 字段
$db->where('id>2')->getField('title',true);
~~~
~~~
//两个字段列表
//两个字段时返回一维数组,第一个字段做为键名使用,第 2 个字段做为键值
$db->getField('id,title');
~~~
~~~
//多个字段时
//多个字段返回二维数组,第一个字段值做为键名使用,其余字段做为键值
$db->getField('id,title,click');
~~~
### group 分组操作
TookPHP框架提供了完善的分组操作方法,自由指定分组参数使发送 SQL 更容易
~~~
//按 id 与 name 分组查询
$list =$db->group('id,name')->all();
//生成SQL: SELECT `id`,`name`,`sendtime` FROM tb_demo GROUP BY id,name
~~~
### having 分组条件
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用 , 所以
使用 HAVING 对分组进行条件筛选 , 所以在使用 HAVING 时应该使用 group 分组。
~~~
//获得记录条数大于 2 的 cid 值
M('news')->having('count(*) >2')->group('cid')->select();
~~~
### add 添加数据(别名 insert)
特点 :
自动过滤非法字段
自动对插入数据进行安全处理
没有传入参数时使用 $_POST 值
返回值为新增主键值或 true
~~~
//实例
$data=array('uname'=>'admin','url'=>'http://www.baidu.com');
$lastId = $db->add($data);
~~~
### ORM 属性映射
~~~
$db->username = '李四';
$db->web = 'baidu.com';
$db->add();
~~~
### replace 添加数据
~~~
//数据中存在主键则更新否则添加数据。
$data =array('id'=>1,'name'=>'admin');
M('news')->replace($data);
~~~
### save 更新(别名 update)
**特点**
a. 自动过滤掉非法字段
b. 自动进行数据安全处理
c. 默认以 $_POST 数据更新
d. 必须有更新条件 , 防止误更新
e. 如果参数中存在主键值将以这个值为条件进行更新数据
~~~
//uid 为表主键,使用数据中的主键为条件进行更新
$data=array('uid'=>9,'username'=>' 郭富城 ');
$db->save($data);
~~~
### setField 更新字段
如果只是更新个别字段的值,可以使用setField方法。
~~~
//更改用户的name值
M("user")->where('id=5')->setField('name','TookPHP');
//生成SQL: update tb_user set name='TookPHP' where id=5
~~~
setField方法支持同时更新多个字段,只需要传入数组即可,例如:
~~~
//更改用户的name和email的值
$data = array('name'=>'TookPHP','email'=>'test@163.com');
M("user")->where('id=5')->setField($data);
~~~
### inc 增加值
注:
* 带三个参数:inc($field, $where, $step)
* 带两个参数:inc($field, $step)
* 只带一个参数:inc($field)
* $step 缺省值 1
~~~
//将 id 为 4 记录的 total 加 1 ()
M('news')->inc('total','id=4',1);
//生成SQL: update tb_news set total=total+1 where id=4
//将 id 为 4 记录的 total 加 1
M('news')->where('id=4')->inc('total');
//生成SQL: update tb_news set total=total+1 where id=4
//将 id 为 4 记录的 total 加 100
M('news')->where('id=4')->inc('total',100);
//生成SQL: update tb_news set total=total+100 where id=4
~~~
### dec 减少值
用法同上 inc方法,唯一区别在于 inc用于增加值,dec用于减少值
~~~
//将 id 为 4 记录的 total 减 1
M('news')->dec('total','id=4',1);
//生成SQL: update tb_news set total=total-1 where id=4
//将 id 为 4 记录的 total 减 100
M('news')->where('id=4')->dec('total',100);
//生成SQL: update tb_news set total=total-100 where id=4
~~~
### del 删除(别名 delete)
为了屏蔽误删除 del 方法必须指定条件
~~~
//删除主键值为 58 的数据
M('news')->del(58);
//生成SQL: DELETE FROM tb_news WHERE id in(58)
~~~
### fieldExists 检测表字段是否存在
~~~
//检测 news 表是否存在 title 字段
$db->fieldExists('title','news');
~~~
### tableExists 检测表是否存在
`M()->tableExists('category');`
### getVersion 获得数据库版本信息
`$db->getVersion();`
### getLastSql 获得最后一条 SQL
$db->getLastSql();
### getAllSql 获得所有 SQL 语句
`$db->getAllSql();`
### getAffectedRows 获得受影响的行数
`$db->getAffectedRows();`
### getInsertId 获得最后插入的主键值
~~~
$data=array('title'=>'标题');
$db->insert($data);
$db->getInsertId();
~~~
### getAllTableInfo 获所有表信息
获得当前数据库的所有表信息 , 数据大小包括碎片、数据、索引
`M()->getAllTableInfo();`
### getDataBaseSize 获得数据库大小
获得当前数据库大小即所有表碎片、数据、索引之和
`M()->getDataBaseSize();`
### getTableSize 获取表大小
~~~
//获得 news 表大小 , 包含表碎片、数据、索引之和
M()->getTableSize('news');
~~~
### createDatabase 创建数据库
~~~
//以 gbk 编码创建数据库 testdb
M()->createDatabase('testdb','gbk');
~~~
### truncate 清空表
~~~
//清空表 news 表并将自增数归零
M()->truncate(news);
~~~
### repair 修复表
`M()->repair('user');`
### optimize 优化表
`M()->optimize('user');`
### rename 修改表名
~~~
//将 user 表更名为 tk_user 表
M()->rename('user','tk_user');
~~~
### dropTable 删除表
`$db->dropTable('user');`
### beginTrans 开启事务
~~~
//完成事务处理需要选择表引擎如 InnoDB、NDB、BDB
$data=array('wages'=>100);
$db->beginTrans();// 开启事务
$db->add($data);// 添加数据
$db->commit(); // 提交事务
~~~
### rollback 事务回滚
~~~
//当事务完整性被破坏或者其他原因可以通过 rollback 方法放弃本次事务操作
$db->rollback();
~~~
### 提交事务 commit()
~~~
//如果整个事务完成正确可以通过 commit() 进行事务的提交完成最终操作
$data=array('wages'=>100);
$db->beginTrans();// 开启事务
$db->add($data);// 添加数据
$db->commit();// 提交本次事务
~~~