thinkphp笔记-链式查询

8787次阅读 648人点赞 作者: WuBin 发布时间: 2024-04-03 10:13:31
扫码到手机查看

链式查询

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"
}
]

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:thinkphp,thinkphp6
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    8186次阅读 521人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3282次阅读 241人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    13228次阅读 854人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12104次阅读 385人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    10347次阅读 829人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    14248次阅读 1132人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14180次阅读 1156人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    27073次阅读 2131人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    23237次阅读 1791人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录