thinkphp笔记-链式查询
链式查询
where
表达式查询,就是where()方法的基础查询方式;
Db::name('user')->where('id', '>', 70)->select();
关联数组查询,通过键值对来数组键值对匹配的查询方式;
$user = Db::name('user')->where([
'gender' => '男',
'price' => 100
])->select();
索引数组查询,通过数组里的数组拼装方式来查询;上面的写法效果等价于:
$user = Db::name('user')->where([
['gender', '=', '男'],
['price', '=', 100]
])->select();
等于号可以改为<>,大于等
$user = Db::name('user')->where([
['gender', '=', '男'],
['price', '>', 100]
])->select();
将复杂的数组组装后,通过变量传递,将增加可读性;
$map[] = ['gender', '=', '男'];
$map[] = ['price', 'in', [60, 70, 80]]; // 结果在60 70 80之间
$user = Db::name('user')->where($map)->select();
字符串形式传递,简单粗暴的查询方式,whereRaw()更适合字符串查询,对字符串转换更严谨,如果字符串中有各种引号,那么就用这个方法,支持复杂字符串格式;
$user = Db::name('user')->whereRaw('gender="男" AND price IN (60,70,80)')->select();
等价
$user = Db::name('user')->where('gender="男" AND price IN (60,70,80)')->select();
如果SQL 查询采用了预处理模式,比如id=:id,也能够支持,推荐用whereRaw;
$user = Db::name('user')->where('id=:id', ['id'=> 19])->select();
等价,如果数据比较复杂,建议用whereRaw
$user = Db::name('user')->whereRaw('id=:id', ['id'=> 19])->select();
field
使用field()方法,可以指定要查询的字段;
$user = Db::name('user')->field('*')->select(); // 是所有的列
$user = Db::name('user')->field('id, username, email')->select(); // 指定id,username,email列的数据
也可以使用数组的方式
Db::name('user')->field(['id', 'username', 'email'])->select();
使用field()方法,给指定的字段设置别名;
$user = Db::name('user')->field('id, username as name, email')->select();
$user = Db::name('user')->field(['id', 'username' => 'name'])->select();
{
id: 19,
username: "蜡笔小新"
},
设置别名后
{
id: 19,
name: "蜡笔小新"
},
在fieldRaw()方法里,可以直接给字段设置MySQL 函数;(实测在tp6中报系统错误)
Db::name('user')->fieldRaw('id,SUM(price)')->select();
使用field(true)的布尔参数,可以显式的查询获取所有字段,而不是*;(效果等同*)
Db::name('user')->field(true)->select();
使用withoutField()方法中字段排除,可以屏蔽掉想要不显示的字段;
$user = Db::name('user')->withoutField('details')->select();
排除多个,字段之间加逗号
Db::name('user')->withoutField('details,id,email')->select();
使用field()方法在新增时,验证字段的合法性;
$data = [
'password' => 987,
'username' => '公孙',
'email' => 'huiye@163.com',
'details' => '123'
];
// field传入字段后,那么只会接收这几个字段,其他字段不接受,其他字段会排除在外 返回0 代表插入失败
$user = Db::name('user')->field('username, email, details')->insert($data);
上面这段会报错:数据表字段不存在:[password]
$data = [
'password' => 987,
'username' => '公孙',
'email' => 'huiye@163.com',
'details' => '123'
];
$user = Db::name('user')->field('username, email, details, password')->insert($data);
// 返回1 插入成功
alias
使用alias()方法,给数据库起一个别名;
$user = Db::name('user')->alias('a')->select();
// SELECT * FROM `tp_user` `a`
return Db::getLastSql();
limit
使用limit()方法,限制获取输出数据的个数
// 限制只输出5条
$user = Db::name('user')->limit(5)->select();
return json($user);
分页模式,即传递两个参数,比如从第3 条开始显示5 条limit(2,5);
// 两个参数,从第三条开始,显示5条
$user = Db::name('user')->limit(2, 5)->select();
limit(从第几个开始,显示多少条),因为下标是从0开始,所以第三条应该是2。
实现分页,需要严格计算每页显示的条数,然后从第几条开始;比如每页显示5条:
//第一页 显示1-5条,从第一条开始
Db::name('user')->limit(0, 5)->select();
//第二页 显示6-10条,从第六条开始,显示5条
Db::name('user')->limit(5, 5)->select();
id username
----------
19 蜡笔小新
20 路飞
21 黑崎一护
24 小明
25 孙悟饭
------ 以上是0,5
26 孙悟天
27 樱桃小丸子
29 孙武
76 李白
79 辉夜
----以上是5,5
Db::name('user')->limit(5, 5)->order('id', 'asc')->select();
// 按照自然顺序从小到大排列
page
tp6自带了page()分页方法,优化了limit()方法,无须计算分页条数;
Db::name('user')->page(1, 5)->order('id', 'desc')->select();
page(第几页,显示几条)
// 第二页,显示5条
$user = Db::name('user')->page(2, 5)->order('id', 'asc')->select();
order
使用order()方法,可以指定排序方式,没有指定第二参数,默认asc;
Db::name('user')->order('id', 'desc')->select();
支持数组的方式,对多个字段进行排序;
比如实现在创建时间倒叙的情况下,价格按正序排列
Db::name('user')->order(['create_time' => 'desc', 'price' => 'asc'])->select();
使用orderRaw()方法,支持排序的时候指定MySQL 函数;
假设我要将 username=“辉夜”的行排第一个,后面的自然排序
Db::name('user')->orderRaw('FIELD(username, "辉夜") DESC')->select();
注意,这里如果使用order就会报错,推荐语句麻烦的字符串使用orderRaw。
gorup
使用group()方法,给性别不同的人进行price 字段的总和统计;分别统计所有gender中男、女分别的价格总和
蜡笔小新 123 男
路飞 123 女
黑崎一护 456 男
小明 123 男
孙悟饭 123 女
孙悟天 123 女
Db::name('user')->field('gender,SUM(price)')->group('gender')->select();
[
{
gender: "女",
SUM(price): "713.00"
},
{
gender: "男",
SUM(price): "764.00"
}
]
也可以进行多字段分组统计;
Db::name('user')->fieldRaw('gender, SUM(price)')->group('gender,password')->select();
having
使用group()分组之后,再使用having()进行进一步的筛选;
比如按照男女组的总分确定冠军,只显示>720的
$user = Db::name('user')
->field('gender,SUM(price)')
->group('gender')
->having('SUM(price)>720')
->select();
最终输出:
[
{
gender: "男",
SUM(price): "764.00"
}
]