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();
通过灵活运用这些链式操作,可以高效地完成各种数据库操作需求,同时确保代码的可读性和维护性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播