thinkPHP常用数据操作(二)查询语言

上一节讲了使用 activerecord(AR)模式操作数据,但是面对复杂的业务逻辑时,AR模式很难应对,因此本节tp提供更加灵活的查询方式。

1 使用字符串作为查询条件(安全性不高)

$User = M("User"); // 实例化User对象
$User->where('type=1 AND status=1')->select();

//生成 SELECT * FROM think_user WHERE type=1 AND status=1

(注:可以配合tp提供的字符串条件的安全预处理机制)

2 使用数组作为查询条件(最常用的方式)

$User = M("User"); // 实例化User对象
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
// 把查询条件传入查询方法
$User->where($condition)->select();

//生成 SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

//多字段查询,那么字段之间的默认逻辑关系是 逻辑与 AND,可通过使用 _logic 定义查询逻辑

$User = M("User"); // 实例化User对象
$condition['name'] = 'thinkphp';
$condition['account'] = 'thinkphp';
$condition['_logic'] = 'OR';
// 把查询条件传入查询方法
$User->where($condition)->select();

//生成  SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp'

3 //对象方式由于效率不高,略过

4 表达式查询

$map['字段名'] = array('表达式','查询条件');

//支持列表如下

//表达式含义
//EQ 等于(=)
//NEQ 不等于(<>)
//GT 大于(>)
//EGT 大于等于(>=)
//LT 小于(<)
//ELT 小于等于(<=)
//LIKE 模糊查询
//[NOT] BETWEEN (不在)区间查询
//[NOT] IN (不在)IN 查询
//EXP 表达式查询,支持SQL语法

//例如 

$map['name'] = array('like','thinkphp%');

$map['id'] = array('between',array('1','8'));//支持字符串或者数组

$map['id'] = array('not in',array('1','5','8'));//支持字符串或者数组

//exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法.例如

$User = M("User"); /
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用户的积分加1
$User->where('id=5')->save($data); // 根据条件保存修改的数据

5快捷查询

(1)实现不同字段相同的查询条件

$User = M("User"); // 实例化User对象
$map['name|title'] = 'thinkphp';
// 把查询条件传入查询方法
$User->where($map)->select();

//name= 'thinkphp' OR title = 'thinkphp'

(2)实现不同字段不的查询条件

$User = M("User"); // 实例化User对象
$map['status&title'] =array('1','thinkphp','_multi'=>true);//'_multi'=>true必须加在数组的最后
// 把查询条件传入查询方法
$User->where($map)->select();

//这种方式也支持更多字段,如

//$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);

6区间查询

$map['id'] = array(array('gt',1),array('lt',10)) ;//默认and连接

$map['id'] = array(array('gt',3),array('lt',10), 'or') ;

$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or');

7组合查询

(1)字符串模式查

$User = M("User"); // 实例化User对象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();

(2)请求字符串查询方式

$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';//类似于URL传参的方式,可以支持简单的条件相等判

(3)复合查询

$where['name'] = array('like', '%thinkphp%');
$where['title'] = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id'] = array('gt',1);

//上述查询方式转换为字符串查询为

$where['id'] = array('gt',1);
$where['_string'] = ' (name like "%thinkphp%") OR ( title like "%thinkphp") ';

7统计查询

//方法说明
//Count 统计数量,参数是要统计的字段名(可选)
//Max 获取最大值,参数是要统计的字段名(必须)
//Min 获取最小值,参数是要统计的字段名(必须)
//Avg 获取平均值,参数是要统计的字段名(必须)
//Sum 获取总分,参数是要统计的字段名(必须)

//举例

$User = M("User"); // 实例化User对象
// 获取用户数:
$userCount = $User->count();
// 或者根据字段统计:
$userCount = $User->count("id");
// 获取用户的最大积分:
$maxScore = $User->max('score');
// 获取积分大于0的用户的最小积分:
$minScore = $User->where('score>0')->min('score');
// 获取用户的平均积分:
$avgScore = $User->avg('score');
// 统计用户的总成绩:
$sumScore = $User->sum('score');

8SQL查询

//ThinkPHP内置的ORM和ActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更
//是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查
询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处

(1)query方法 

//用法query($sql,$parse=false)

$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->query("select * from think_user where status=1");

(2)execute方法 

//用法execute($sql,$parse=false)

$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->execute("update think_user set name='thinkPHP' where status=1");

9 动态查询 .感觉用处较少,此处略过

10 子查询(尚未熟练使用)

(1)使用select方法

//当select方法的参数为false的时候,表示不进行查询只是返回构建SQL

$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('s
tatus')->select(false);

(2)使用buildSql方法

$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('s
tatus')->buildSql();

// 利用子查询进行查询
$model->table($subQuery.' a')->where()->order()->select()

select(false)与buildSql(),相当于优先构建出一条select的子查询,然后相当于把结果集AS给a表,如table($subQuery.'a'),然后再对a表执行select count(*) from a,完成子查询的处理

以上内容大部分摘自 thinkphp3.2.3快速入门,详情请参考官方手册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值