15-18,数据库的链式查询,高级查询和快捷查询方法
数据库的链式查询,高级查询和快捷查询方法
15。链式查询方法。上
where()、 field()和 alias()。
一.where
1. 表达式查询,就是 where()方法的基础查询方式;
Db::name('user')->where('id', '>', 70)->select();
2. 关联数组查询,通过键值对来数组键值对匹配的查询方式;
$user = Db::name('user')->where([
'gender' => '男',
'price' => 100 //'price' => [60,70,80]
])->select();
3. 索引数组查询,通过数组里的数组拼装方式来查询;
$user = Db::name('user')->where([
['gender', '=', '男'],
['price', '=', '100']
])->select();
4. 将复杂的数组组装后,通过变量传递,将增加可读性;
$map[] = ['gender', '=', '男'];
$map[] = ['price', 'in', [60, 70, 80]];
$user = Db::name('user')->where($map)->select();
5. 字符串形式传递,简单粗暴的查询方式,whereRaw()支持复杂字符串格式;
Db::name('user')->whereRaw('gender="男" AND price IN (60, 70, 80)')->select();
直接用Where也可以,whereraw只是转化了一下字符串,字符串转化的更好一些
Db::name('user')->where('gender="男" AND price IN (60, 70, 80)')->select();
6. 如果 SQL 查询采用了预处理模式,比如 id=:id,也能够支持;
Db::name('user')->whereRaw('id=:id', ['id'=>19])->select();
Db::name('user')->where('id=:id', ['id'=>19])->select(); //where也支持,推荐用whereraw
...
二.field
1. 使用 field()方法,可以指定要查询的字段;
Db::name('user')->field('id, username, email')->select();
也可以用数组:
Db::name('user')->field(['id', 'username', 'email'])->select();
2. 使用 field()方法,给指定的字段设置别名;
Db::name('user')->field('id,username as name')->select();
Db::name('user')->field(['id', 'username'=>'name'])->select();
3. 在 fieldRaw()方法里,可以直接给字段设置 MySQL 函数;
Db::name('user')->fieldRaw('id,SUM(price)')->select(); //field也可以,但复杂的最好用fieldraw
4. 使用 field(true)的布尔参数,可以显式的查询获取所有字段,而不是*;
Db::name('user')->field(true)->select();
5. 使用 withoutField()方法中字段排除,可以屏蔽掉想要不显示的字段;
Db::name('user')->withoutField('details')->select();
排除多个时,用逗号。
6. 使用 field()方法在新增时,验证字段的合法性;
Db::name('user')->field('username, email, details')->insert($data);
只接受这几个字段,其他的字段不接受
否则会提示,字段不存在。
三.alias
1. 使用 alias()方法,给数据库起一个别名;
Db::name('user')->alias('a')->select();
实际sql:select * from tp_user a
===
16. 链式查询方法.下
1.limit
2.page
3.order
4.group
5.having
+++
一.limit
1. 使用 limit()方法,限制获取输出数据的个数;
Db::name('user')->limit(5)->select();
2. 分页模式,即传递两个参数,比如从第 3 条开始显示 5 条 limit(2,5);
Db::name('user')->limit(2, 5)->select();
3. 实现分页,需要严格计算每页显示的条数,然后从第几条开始;
//第一页
Db::name('user')->limit(0, 5)->select();
//第二页
Db::name('user')->limit(5, 5)->select();
二.page
1. page()分页方法,优化了 limit()方法,无须计算分页条数;
//第一页
Db::name('user')->page(1, 5)->select();
//第二页
Db::name('user')->page(2, 5)->select();
三.order
1. 使用 order()方法,可以指定排序方式,没有指定第二参数,默认 asc;
Db::name('user')->order('id', 'desc')->select();
2. 支持数组的方式,对多个字段进行排序;
Db::name('user')->order(['create_time'=>'desc', 'price'=>'asc'])->select();
3. 使用 orderRaw()方法,支持排序的时候指定 MySQL 函数;
Db::name('user')->orderRaw('FIELD(username,"樱桃小丸子") DESC')->select();
如果有多个樱桃小丸子
樱桃小丸子排在最前
四.group
1. 使用 group()方法,给性别不同的人进行 price 字段的总和统计;
Db::name('user')->fieldRaw('gender, SUM(price)')
->group('gender')->select();
2. 也可以进行多字段分组统计;
Db::name('user')->fieldRaw('gender, SUM(price)')
->group('gender,password')->select();
可以多字段group
五.having
1. 使用 group()分组之后,再使用 having()进行筛选;
$result = Db::name('user')
->fieldRaw('gender, SUM(price)')
->group('gender')
->having('SUM(price)>600')
->select();
只显示sum>600的记录。
===
17. 数据库的高级查询
学习要点:
1.高级查询
本节课我们要学习查询中的几种高级查询方式,了解更多拼装 SQL 的细节。
一.高级查询
1. 使用|(OR)或&(AND)来实现 where 条件的高级查询,where 支持多个连缀;
$user = Db::name('user')
->where('username|email', 'like', '%xiao%') // username|email=username or email like
->where('price&uid', '>', 0)
->select();
//生成的 SQL
SELECT * FROM `tp_user` WHERE ( `username` LIKE '%xiao%' OR `email` LIKE
'%xiao%' ) AND ( `price` > 0 AND `uid` > 0 )
2. 关联数组方式,可以在 where 进行多个字段进行查询;
$user = Db::name('user')->where([
['id', '>', 0],
['status', '=', 1],
['price', '>=', 80],
['email', 'like', '%163%']
])->select();
//生成的 SQL
SELECT * FROM `tp_user` WHERE `id` > 0 AND `status` = 1 AND `price` >= 80 AND
`email` LIKE '%163%'
3. 根据之前的课程中,条件字符串复杂组装,比如使用 exp 了,就使用 raw()方法;
$user = Db::name('user')->where([
['status', '=', 1],
['price', 'exp', Db::raw('>80')] //Db::raw封装起来
])->select();
//生成的 SQL
SELECT * FROM `tp_user` WHERE `status` = 1 AND ( `price` >80 )
4. 如果有多个 where,并且 where 条件是分离的$map,而$map 本身有多个条件;
5. 那么$map 条件如果需要先执行出结果,再和后续条件判断,也就是加上括号;
6. 那么,需要对这个$map 变量,再加上一个中括号处理优先级;
$map = [
['price', 'exp', Db::raw('>80')]
];
$user = Db::name('user')
->where([$map]) // $map加上中括号,作为一个整体
->where('status', '=', '%163.com%')->select();
//生成的 SQL
SELECT * FROM `tp_user` WHERE ( `status` = 1 AND ( `price` >80 ) ) AND `status`
= %163.com%
7. 如果,条件中有多次出现一个字段,并且需要 OR 来左右筛选,可以用 whereOr;
$map1 = [
['username', 'like', '%小%'],
['email', 'like', '%163%']
];
$map2 = [
['username', 'like', '%孙%'],
['email', 'like', '%.com%']
];
$user = Db::name('user')
->whereOr([$map1, $map2])->select(); //两个字段,用逗号分开
//生成的 SQL
SELECT * FROM `tp_user` WHERE ( `username` LIKE '%小%' AND `email` LIKE '%163%' )
OR ( `username` LIKE '%孙%' AND `email` LIKE '%.com%' )
8. 闭包查询可以连缀,会自动加上括号,更清晰,如果是 OR,请用 whereOR();
$user = Db::name('user')->where(function ($query) {
$query->where('id', '>', 10);
})->whereOr(function ($query) {
$query->where('username', 'like', '%小%');
})->select();
//生成sql
SELECT * FROM tp_user WHERE (id> 0 ) OR ( username LIKE '%小%')
9. 对于比较复杂或你不知道如何拼装 SQL 条件,那么就直接使用 whereRaw()即可;
$user = Db::name('user')
->whereRaw('(username LIKE "%小%" AND email LIKE "%163%") OR (price > 80)')
->select();
10. whereRaw()方式也支持参数绑定操作,具体如下;
$user = Db::name('user')
->whereRaw('(username LIKE :username AND email LIKE :email)
OR (price > :price)',
['username'=>'%小%', 'email'=>'%163%', 'price'=>80])
->select();
...
===
18. 数据库的快捷查询
学习要点:
1.快捷查询
2.其它补充
本节课我们要学习查询中的快捷查询方法,是系统封装好的 where 方法。
一.快捷查询
1. 系统封装了很多 where 方法的快捷方式,之前学习了一些,全部如下:
whereor
字段OR查询
whereXor
字段XOR查询
whereNull
查询字段是否为Null
whereNotNull
查询字段是否不为Null
whereIn
字段IN查询
whereNotIn
字段NOTIN查询
whereBetween
字段BETWEEN查询
whereNotBetween
字段NOT BETWEEN查询
whereLike
字段LIKE查询
whereNotLike
字段NOT LIKE查询
whereExists
EXISTS条件查询
whereNotExists
NOT EXISTS条件查询
whereExp
表达式查询
whereColumn
比较两个字段
...
2. whereColumn()方法,比较两个字段的值,符合的就筛选出来;
$user = Db::name('user')
->whereColumn('update_time', '>=', 'create_time')
->select();
//相等可以简化,只需要两边的字段
whereColumn('update_time', 'create_time')
...
3. 系统还针对字段查询提供了几个方便查询的快捷方式;
4. whereFieldName()方法,查询某个字段的值,注意 FileName 是字段名;
Db::name('user')->whereEmail('[email protected]')->find();
Db::name('user')->whereUsername('蜡笔小新')->find();
//Username,name没有大写,因为字段名就是username,如果写成UserName,会提示找不到字段user_name
//如果字段是 create_time,则whereCreateTime,驼峰式写法;
...
5. getByFieldName()方法, 查询某个字段的值, 注意只能查询一条, 不需要 find();
Db::name('user')->getByEmail('[email protected]');
6. getFieldByFieldName()方法,通过查询得到某个指定字段的单一值;
Db::name('user')->getFieldByEmail('[email protected]', 'username');
只返回username字段(第一个参数是条件参数,第二个,要显示的字段)
二.其它补充
1. when()可以通过条件判断,执行闭包里的分支查询;
$user = Db::name('user')->when(false, function ($query) {
$query->where('id', '>', 0);
}, function ($query) {
$query->where('username', 'like', '%小%');
})->select();
...
//when(参数1-布尔值,参数2-匿名参数,参数3-匿名参数)
参数1=true时,执行参数2条件,
参数1=flase时,执行参数3条件,
Tag:
Thinkphp
Thinkphp笔记