thinkPHP常用数据操作(二)查询语言 古城微笑少年丶 2022-07-13 08:21 193阅读 0赞 上一节讲了使用 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快速入门,详情请参考官方手册
还没有评论,来说两句吧...