ThinkPHP中Db类用于直接数据库查询:需use think\Db引入;支持table()->select()/find()基础查询、field()指定字段、where()复杂条件、paginate()分页、count()/sum()聚合及query()/execute()原生SQL执行。

如果您在ThinkPHP项目中需要执行数据库查询操作,但对Db类的使用方式不熟悉,则可能是由于未正确引入Db类或未掌握其基本语法结构。以下是使用Db类查询数据的具体方法:
一、基础查询操作
Db类提供了简洁的链式调用接口,可直接进行数据表的查询,无需定义模型类,适用于简单、临时性查询需求。该方式通过静态方法调用,自动连接默认配置的数据库连接。
1、在控制器或逻辑文件中,使用use think\Db;引入Db类。
2、调用Db::table('user')->select();查询user表全部数据。
立即学习“PHP免费学习笔记(深入)”;
3、若需条件查询,可链式调用where()方法,例如:Db::table('user')->where('status', 1)->select();。
4、查询单条记录时,使用find()替代select(),如:Db::table('user')->where('id', 5)->find();。
二、指定字段与别名查询
为避免冗余数据传输并提升查询效率,可通过field()方法限定返回字段;同时支持SQL标准别名语法,便于处理字段冲突或增强可读性。
1、只查询id和name字段:Db::table('user')->field('id,name')->select();。
2、为字段设置别名:Db::table('user')->field('id as user_id, name as user_name')->select();。
3、使用数组方式传入字段及别名:Db::table('user')->field(['id'=>'uid', 'name'=>'username'])->select();。
4、排除某些字段(如不查password):Db::table('user')->field(true)->where('id', 1)->find();,其中true表示查询除password外所有字段(需在数据库配置中设置fields_strict为true并定义except字段)。
三、复杂条件与表达式查询
Db类支持多条件组合、区间查询、LIKE模糊匹配及原生SQL表达式,适用于动态筛选与业务逻辑复杂的场景。
1、多条件AND查询:Db::table('user')->where('age', '>', 18)->where('status', 1)->select();。
2、OR条件组合:Db::table('user')->where('status', 1)->whereOr('level', 'admin')->select();。
3、区间查询:Db::table('user')->where('age', 'between', [18, 60])->select();。
4、模糊查询:Db::table('user')->where('name', 'like', '%张%')->select();。
5、使用闭包构造动态条件:Db::table('user')->where(function ($query) { $query->where('status', 1)->whereOr('score', '>', 90); })->select();。
四、分页与聚合查询
分页功能可减少单次响应数据量,提升前端渲染性能;聚合函数则用于统计分析类需求,如计数、求和、平均值等。
1、启用分页查询:Db::table('user')->paginate(10);,返回包含分页信息的Collection对象。
2、自定义每页数量与当前页码:Db::table('user')->paginate(['list_rows'=>15, 'page'=>2]);。
3、获取记录总数:Db::table('user')->count();。
4、求总金额:Db::table('order')->sum('amount');。
5、计算平均年龄:Db::table('user')->avg('age');。
五、原生SQL与参数绑定查询
当链式查询无法满足特定SQL语法要求(如UNION、子查询、存储过程调用)时,可直接执行原生SQL语句,并通过参数绑定防止SQL注入。
1、执行无参数SELECT语句:Db::query('SELECT * FROM user WHERE status = ?', [1]);。
2、执行带命名参数的查询:Db::query('SELECT * FROM user WHERE status = :status AND level = :level', ['status'=>1, 'level'=>'vip']);。
3、执行UPDATE语句:Db::execute('UPDATE user SET score = score + ? WHERE id = ?', [10, 5]);。
4、使用fetchSql(true)预览生成的SQL:echo Db::table('user')->where('id', 1)->fetchSql(true)->find();,输出结果为SELECT * FROM `user` WHERE `id` = 1。



















