查询方式
Thinkphp提供了三种基本的查询方式:字符串条件查询、索引数组条件查询和对象条件查询、在大多数情况下,推荐使用索引数组和对象方式为查询条件,因为会更加安全
1、使用字符串作为条件查询
//字符串作为条件查询
$user = M('User');
var_dump($user->where(' id = 1 AND user = “蜡笔小新” ')->select());
PS:where查询方法里面只要包含条件即可,多个条件加上AND等链接符即可,我们会在SQL连贯操作详细学习。
2、使用索引数组作为查询条件
//索引数组作为条件查询
$user = M('User');
$condition[' user '] = '蜡笔小新';
$condition[' id'] = '蜡笔小新';
var_dump($user->where($condition)->select());
PS:索引数查询的默认逻辑关系是AND,如果想改变为OR,可以使用_logic定义查询逻辑
基于上面的代码增加如下一行:
$condition['_logic'] = 'OR' //将默认AND改为OR
3、使用对象方式来查询
//对象作为条件查询
$user = M('User');
$condition = new \stdClass();
$condition->id = 1;
$condition->user = '蜡笔小新'
var_dump($user->where($condition)->select());
PS:stdClass类是PHP内置的类,可以理解为一个空雷,在这里可以理解为把条件的字段作为成员保存在stdClass类里,而这里的‘\’是将命名空间设置为根目录,否则会导致当前目录找不到次类。
PS:使用对象和数组查询,效果是一样的,可以互换,在大多数情况下,tinkPHP推荐使用数组形式更加高效
表达式查询
对于那些药实现模糊判断的查询,比如大于、等于、小于之类的SQL查询,可以使用表达式查询方式
查询表达式格式:$map['字段名'] = array(' 表达式 ' , ‘ 查询条件 ’);
表达式查询表
表达式 含义
EQ 等于
NEQ 不等于
GT 大于
EGT 大于等于
LT 小于
ELT 小于等于
[NOT]LIKE 模糊查询
[NOT]BETWEEN (不在)区间查询
[NOT]IN (不在)IN查询
EXP 表达式查询,支持SQL语法
PS:表达式不区分大小写
//查询表达式:$map['字段名'] = array('表达式',"查询条件");
$user = M('User');
//等于
$map['id'] = array('eq',1);//id这个字段 的值等于(eq)1
//不等于
$map['id'] = array('neq',1);//id这个字段 的值不等于(neq)1,这时候会查出所有id不等于1的值
//模糊查询
$map['user'] = array('like','%小%');//模糊查询user里面带小字的
//模糊查询的数组方式
$map['user'] = array('like' , array('%小%', '%腊%'), 'AND');//又包含小的 又包含腊的 如果不写AND 那就当是或了。会查出既包含小的,又包含腊的
//区间查询
$map['id'] = array('between' , '1,3') //查询id在1到3区间的条目
//区间查询数组形式
$map['id'] = array('between', array('1','3'));//查询id在1到3之间的条目
//区间查询 不在范围之内的
$map['id'] = array('not between', '1,3');//查询id 不在1到3的范围之内的所有元素
//IN区间查找
$map['id'] = array('in' , '1,2,4');//查询id等于1,2,4的条目
//not IN 查找
$map['id'] = array('not in' , '1,2,4');//查询id 不等于1,2,4的条目。
//小于查询
$map['id'] = array('exp' , '<1');//查询id
var_dump($user->where($map)->select());
快捷查询
//快捷查询方式是一中多字段查询的简化写法,在多个字段之间用 ' | '隔开表示OR,用‘&’隔开表示AND
1、不同字段相同查询条件
//使用相同的查询条件
$user = M('User');
$map[' user|email '] = 'a'; // ' | '换成‘ & ’变成AND
var_dump($user->where($map)->select());
2、不同字段不同查询条件
//使用不同查询条件
$user = M(' User ');
$map[' id&user '] = array(1, '蜡笔小新',_multi=>true);
var_dump($user->where($map)->select());
PS:设置‘_multi’为true,是为了让id对应1,让user对应‘蜡笔小新’,否则就会出现id对应了1还要对应‘蜡笔小新’的情况,而且,这设置要在放在数组最后
//支持使用表达式结合快捷查询
$user = M('User');
$map[' id&user '] = array(array(' gt ' ,0), '蜡笔小新' ,'_multi '=>true);
var_dump($user->where($map)->select());
区间查询
ThinkPHP支持对某个字段的区间查询
//区间查询
$user = M('User');
$map[' id '] = array( array(' gt ' , 1 ) , array( ' lt ' , 4 ) );//意思是id大于1 和id小于4的。
var_dump($user->where($map)->select());
//第三个参数设置逻辑OR
$user = M(' User ');
$map[' id '] = array( array(' gt ' , 1) , array( ' lt ' , 4) , 'OR');
var_dump($user->where($map)->select);
组合查询
组合查询是基于索引数组查询方式的一个拓展性查询,添加了字符串查询(_string),复合查询(_complex),请求字符串查询(_query),由于采用的是索引数组,重复的会被覆盖。
//字符串查询(_string)
$user = M(User);
$map[' id '] = array(' eq ' , 1);
$map[' _string '] = ' user= "蜡笔小新" AND mail = “xiaoxin@163.com” ';
var_dump($user->where($map)->select());
//请求字符串查询(_query)
$user = M('User');
$map[' id '] = array('eq' ,1);
$map['_query'] = 'user = 蜡笔小新&maile = xiaoxin@163.com&_logic=OR';
var_dump($user->where($map)->select());
PS:这总方式是URL方式,不需要加引号
//复合查询(_complex)
$user = M(User);
$where[' user '] = array(' like ' , ' %小% ');
$where['id'] = 1;
$where['_logic'] = 'OR'
$map['_complex'] = $where;
$map['id'] = 3;
$map['_logic'] = 'OR'
var_dump($user->where($map)-select());
PS:复合查询可以构建更加复杂的查询,这里id=1或者id = 3可以构建实现。
统计查询
//Tinkphp提供了一些统计查询的方法
//数据总条数,遇到NULL不统计
$user = M('User');
var_dump($user->count(' mail ' ) );
//最大值
$user = M('User');
var_dump($user->max(' id ' ) );
//最小值
$user = M('User');
var_dump($user->min(' id ' ) );
//平均值
$user = M('User');
var_dump($user->avg(' id '));
//求总和
$user = M(' User ');
var_dump($user->sum(' id '));
动态查询
借助PHP5语言的特性,ThinkPhp实现了动态查询
1、getBy动态查询
//查找mail=xiaoxin@163.com的数据
$user = M('User');
var_dump($user->getByMail('xiaoxin@163.com'));
2、getFieldBy动态查询
//通过user得到相应id值
$user = M('User');
var_dump($user->getFieldByUser('路飞',‘id’));
SQL查询
ThikPHP支持原生SQL查询
1、query读取
//查询结果集,如果采用分布式读写分离,即始终在读服务器执行。
$user = M('User');
var_dump($user->query('SELECT *FROM think_user'));
2、execute写入
//更新和写入,如果采用分布式读写分离,则始终在写服务器执行
$user = M('User');
var_dump($user->execute('UPDATE think_user set user=''蜡笔大新“ WHERE id=1' ));
PS:由于子查询用了不少连贯操作,我们会在连贯才做讲解。
//实例化Model类
//字符串作为条件查询
$user = M('User');
//查出user表中的 id=1的 名称为蜡笔小新的数据。
var_dump($user->where('id=1 AND user="蜡笔小新" ')->select())
-----------------分割线-----------------
-----------------分割线-----------------
--------------------------分割线----------------------
####快捷查询
快捷查询方式是一种多字段查询的简化写法,在多个字段之间用'|'隔开表示OR,用‘&’隔开表示AND
1、不同字段相同查询条件
//使用字段相同查询条件
$user = M('User');
$map['user|email'] = 'a'; //'|'换成‘&’变成AND
2、不同字段不同查询条件
//使用不同查询条件
$user = M('User');
$map['id&user'] = array(1,'蜡笔小新',‘_multi’=>true);//这句代码的意思是id和user分别对应着1 和 蜡笔小新 _multi=>true意思是一一对应。如果不写这个得话,会出现id对应了1还要对应‘蜡笔小新’的情况,而且,这设置要放在数组最后。
//支持使用表达式结合快捷查询
$user = M('User');
$map['id&user'] = array(array('gt',0),'蜡笔小新',‘_multi’=>true);//gt的意思是大于 整体的意思是 id大于0的 user是蜡笔小新的 这一条。
----------------分割线----------
###组合查询
$user = M('User');
$map['id'] = array('eq',1);
$map['_string'] = 'user="蜡笔小新" AND email=“xiaoxin@163.com” ';//
var_dump($user->where($map)->select());
六、统计查询