打造一套属于自己的php开发框架(一)封装Db类

一直使用thinkphp或者laravel框架,越到后面越发现,这些框架占用太大了,最主要的是很多东西完全用不到,我就想为啥不能自己封装一个?想到就搞,这个是一个Db类,主要封装了MySQL的增删改查方法,使用起来类似thinkphp和laravel。

多的不说了,直接上代码:

<?php

class Db
{
    protected static \PDO $connection; // 数据库连接
    protected static string $table; // 数据表名
    protected static array $wheres = []; // 查询条件
    protected static ?int $findId = null; // 查找的记录 ID
    protected static bool $initialized = false; // 数据库连接是否已初始化

    // 确保数据库连接已建立
    protected static function ensureConnection()
    {
        if (!self::$initialized) {
            self::$connection = new \PDO("mysql:host=localhost;dbname=数据库名称", "数据库用户名", "数据库密码");
            self::$initialized = true;
        }
    }

    // 设置数据表名
    public static function table(string $table): self
    {
        self::ensureConnection();
        self::$table = $table;
        return new self();
    }

    // 设置查询条件
    public static function where(string $column, string $operator, $value): self
    {
        self::$wheres[] = compact('column', 'operator', 'value');
        return new self();
    }

    // 根据 ID 查询记录
    public static function find(int $id): array
    {
        self::ensureConnection();
        $query = "SELECT * FROM " . self::$table . " WHERE id = :id";
        $statement = self::$connection->prepare($query);
        $statement->execute([':id' => $id]);
        return $statement->fetch(\PDO::FETCH_ASSOC);
    }

    // 查询符合条件的记录
    public static function get(): array
    {
        self::ensureConnection();
        $query = "SELECT * FROM " . self::$table;

        if (!empty(self::$wheres)) {
            $query .= " WHERE ";
            foreach (self::$wheres as $where) {
                $query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";
            }
            $query = rtrim($query, " AND ");
        }

        $statement = self::$connection->prepare($query);
        $statement->execute();
        return $statement->fetchAll(\PDO::FETCH_ASSOC);
    }

    // 分页查询
    public static function paginate(int $page = 1, int $perPage = 10): array
    {
        self::ensureConnection();
        $offset = ($page - 1) * $perPage;
        $query = "SELECT COUNT(*) as count FROM " . self::$table;

        if (!empty(self::$wheres)) {
            $query .= " WHERE ";
            foreach (self::$wheres as $where) {
                $query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";
            }
            $query = rtrim($query, " AND ");
        }

        $statement = self::$connection->prepare($query);
        $statement->execute();
        $totalResults = $statement->fetchColumn();

        $query = "SELECT * FROM " . self::$table;
        if (!empty(self::$wheres)) {
            $query .= " WHERE ";
            foreach (self::$wheres as $where) {
                $query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";
            }
            $query = rtrim($query, " AND ");
        }
        $query .= " LIMIT $perPage OFFSET $offset";

        $statement = self::$connection->prepare($query);
        $statement->execute();
        $results = $statement->fetchAll(\PDO::FETCH_ASSOC);

        $totalPages = ceil($totalResults / $perPage);

        return [
            'data' => $results,
            'total' => $totalResults,
            'perPage' => $perPage,
            'currentPage' => $page,
            'totalPages' => $totalPages,
        ];
    }

    // 插入数据
    public static function insert(array $data): bool
    {
        self::ensureConnection();
        $columns = implode(', ', array_keys($data));
        $placeholders = implode(', ', array_fill(0, count($data), '?'));
        $values = array_values($data);

        $query = "INSERT INTO " . self::$table . " ($columns) VALUES ($placeholders)";
        $statement = self::$connection->prepare($query);
        return $statement->execute($values);
    }

    // 更新数据
    public static function update(array $data, int $id): bool
    {
        self::ensureConnection();
        $updates = [];
        foreach ($data as $column => $value) {
            $updates[] = "$column = ?";
        }
        $setClause = implode(', ', $updates);

        $query = "UPDATE " . self::$table . " SET $setClause WHERE id = ?";
        $values = array_values($data);
        $values[] = $id;

        $statement = self::$connection->prepare($query);
        return $statement->execute($values);
    }

    // 删除数据
    public static function delete(int $id): bool
    {
        self::ensureConnection();
        $query = "DELETE FROM " . self::$table . " WHERE id = ?";
        $statement = self::$connection->prepare($query);
        return $statement->execute([$id]);
    }
}

使用方法:

假设有一个名为 users 的数据表

1.插入一条数据

Db::table('users')->insert(['name' => 'John', 'age' => 30]);

2.查询 ID 为 1 的记录

$result = Db::table('users')->find(1);
var_dump($result); // 输出查询结果

3.更新 ID 为 1 的记录

Db::table('users')->update(['age' => 35], 1);

4.查询年龄大于 30 的用户,并分页显示

$users = Db::table('users')->where('age', '>', 30)->paginate(1, 10);
var_dump($users); // 输出分页结果

5.删除 ID 为 1 的记录

Db::table('users')->delete(1);

大概就是这样了,实现了简单的增删改查,如果不够的可以自己添加一些代码

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 18:00:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 18:00:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 18:00:04       82 阅读
  4. Python语言-面向对象

    2024-04-21 18:00:04       91 阅读

热门阅读

  1. Linux 日志常用命令

    2024-04-21 18:00:04       156 阅读
  2. 微信小程序实现腾讯地图

    2024-04-21 18:00:04       35 阅读
  3. 物联网智能互联创新开发平台

    2024-04-21 18:00:04       38 阅读
  4. uniapp中使用axios在真机运行报错(一)

    2024-04-21 18:00:04       27 阅读
  5. 微服务OR单体架构

    2024-04-21 18:00:04       30 阅读
  6. 微服务面试题

    2024-04-21 18:00:04       37 阅读
  7. 深入解析NPM:常用命令详解与实战示例

    2024-04-21 18:00:04       33 阅读