PHP项目ThinkPHP数据库链式操作

wen PHP项目 3

ThinkPHP 数据库链式操作详解

链式操作基础概念

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

PHP项目ThinkPHP数据库链式操作

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() 查询缓存 数据量大的查询

注意事项

  1. 链式操作顺序:链式方法顺序不影响结果,但建议按逻辑顺序书写
  2. 安全性:使用参数绑定,避免SQL注入
  3. 性能:避免跨表查询过多数据,合理使用索引
  4. 链式中断:每次执行方法(select/find/update等)后,链式对象会重置
// 安全示例:自动参数绑定
Db::name('user')
    ->where('id', input('id'))
    ->find();

通过灵活运用这些链式操作,可以高效地完成各种数据库操作需求,同时确保代码的可读性和维护性。

抱歉,评论功能暂时关闭!