ThinkPHP 数据库链式操作详解
链式操作基础概念
ThinkPHP的链式操作允许我们通过连续调用多个方法构建数据库查询,每个方法返回当前对象实例,最终通过执行方法(如select()、find()等)完成查询。

Db::name('user')
->where('status', 1)
->order('create_time', 'desc')
->limit(10)
->select();
核心链式操作符
查询操作符
| 操作符 | 作用 | 示例 |
|---|---|---|
where() |
查询条件 | ->where('id', 1) |
whereOr() |
OR条件 | ->whereOr('age', '>', 18) |
order() |
排序 | ->order('id desc') |
limit() |
限制条数 | ->limit(10) |
page() |
分页 | ->page(2, 10) |
field() |
字段选择 | ->field('id,name') |
group() |
分组 | ->group('category_id') |
having() |
分组条件 | ->having('count(1) > 2') |
distinct() |
去重 | ->distinct(true) |
高级查询操作
// 多条件查询
Db::name('user')
->where([
'status' => 1,
'age' => ['between', '18,30']
])
->select();
// 关联查询
Db::name('user')
->alias('u')
->join('order o', 'u.id = o.user_id')
->field('u.name, o.order_no')
->select();
// 子查询
$subQuery = Db::name('order')->field('user_id');
Db::name('user')
->where('id', 'in', $subQuery)
->select();
常用链式操作完整示例
基本查询组合
// 完整查询示例
$list = Db::name('article')
->field('id,title,author,views')
->where('status', 1)
->where('views', '>', 100)
->whereOr('is_recommend', 1)
->order('views', 'desc')
->limit(20)
->select();
// 支持多个条件的数组写法
$list = Db::name('user')
->where([
'status' => 1,
'age' => ['between', [18, 30]],
'name' => ['like', '%张%']
])
->field('id,name,age')
->select();
统计查询
// 统计数量
$count = Db::name('order')
->where('status', 1)
->count();
// 分组统计
$stats = Db::name('order')
->field('user_id, count(*) as order_count, sum(amount) as total_amount')
->group('user_id')
->having('count(*) > 5')
->select();
// 聚合函数
$max = Db::name('product')->max('price');
$avg = Db::name('product')->where('status',1)->avg('price');
写入操作链式写法
// 新增
$id = Db::name('user')->insert([
'name' => '张三',
'age' => 25
]);
// 批量新增
Db::name('user')->insertAll([
['name' => '张三', 'age' => 25],
['name' => '李四', 'age' => 26],
]);
// 更新
Db::name('user')
->where('id', 1)
->update([
'name' => '王五',
'age' => 28
]);
// 递增/递减
Db::name('article')
->where('id', 1)
->inc('views', 1) // 递增
->update(); // 需要执行update()
// 删除
Db::name('user')->where('id', 1)->delete();
高级链式操作技巧
条件构造器
use think\db\Query;
// 复杂条件构造
$query = Db::name('user');
$query->where(function (Query $query) {
$query->where('age', '>', 18)
->whereOr('status', 'admin');
});
$query->where('created_at', '>=', '2024-01-01');
$users = $query->select();
// 区间查询
$query->whereTime('created_at', 'today');
$query->whereBetween('age', [18, 30]);
动态查询
// 动态条件
$params = [
'status' => 1,
'keyword' => '搜索词',
'category' => 5
];
$query = Db::name('product');
if (!empty($params['status'])) {
$query->where('status', $params['status']);
}
if (!empty($params['keyword'])) {
$query->where('name', 'like', "%{$params['keyword']}%");
}
if (!empty($params['category'])) {
$query->where('category_id', $params['category']);
}
$results = $query->select();
链式操作复用
// 定义一个基础查询
$baseQuery = Db::name('order')
->where('status', 'in', [1, 2])
->where('deleted', 0);
// 复用基础查询
$todayOrders = $baseQuery->whereTime('created_at', 'today')->select();
$weekOrders = $baseQuery->whereTime('created_at', 'week')->select();
$monthOrders = $baseQuery->whereTime('created_at', 'month')->select();
链式操作执行顺序
// 链式操作的执行顺序通常为:
// where -> join -> group -> having -> order -> limit -> select
$result = Db::name('order')
->where('o.status', 1) // 1. 条件
->join('user u', 'o.user_id = u.id') // 2. 连接
->field('u.name, o.*') // 3. 字段
->group('u.id') // 4. 分组
->having('count(*) > 2') // 5. 分组条件
->order('o.created_at desc') // 6. 排序
->limit(0, 10) // 7. 分页
->select(); // 8. 执行
常用链式操作速查表
| 方法名称 | 描述 | 使用场景 |
|---|---|---|
alias() |
表别名 | JOIN 查询,多表关联 |
field() |
选择/排除字段 | 特定字段查询 |
where() |
条件过滤 | 基础查询 |
whereOr() |
或条件 | 多个可选条件 |
join() |
关联查询 | 多表数据查询 |
order() |
排序 | 数据排列顺序 |
group() |
分组 | 统计报表 |
having() |
分组条件 | 配合group使用 |
limit() |
限制数量 | 分页、Top N |
page() |
分页 | 数据列表分页 |
cache() |
查询缓存 | 数据量大的查询 |
注意事项
- 链式操作顺序:链式方法顺序不影响结果,但建议按逻辑顺序书写
- 安全性:使用参数绑定,避免SQL注入
- 性能:避免跨表查询过多数据,合理使用索引
- 链式中断:每次执行方法(
select/find/update等)后,链式对象会重置
// 安全示例:自动参数绑定
Db::name('user')
->where('id', input('id'))
->find();
通过灵活运用这些链式操作,可以高效地完成各种数据库操作需求,同时确保代码的可读性和维护性。