数据库系统

最后更新: 2026-01-27 11:02:47

数据库系统

Unicode Framework 提供了完整的数据库操作支持,包括查询构建器、ORM 模型、数据库迁移和事务处理等功能。

概述

Unicode Framework 的数据库系统提供了:

  • 查询构建器:流畅的 SQL 查询构建接口,支持参数绑定防止 SQL 注入
  • ORM 模型:ActiveRecord 风格的 ORM,支持模型关联、事件、作用域等
  • 数据库迁移:版本化的数据库结构管理
  • 事务支持:完整的事务管理机制
  • 多数据库支持:MySQL、PostgreSQL、SQLite
  • 数据库配置

    基本配置

    config/database.php 中配置数据库连接:

    return [
        'default' => env('DB_CONNECTION', 'mysql'),
    

    'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', 3306), 'database' => env('DB_DATABASE', 'database'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ],

    'pgsql' => [ 'driver' => 'pgsql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', 5432), 'database' => env('DB_DATABASE', 'database'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', ],

    'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], ], ];

    环境变量

    .env 文件中配置:

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=myapp
    DB_USERNAME=root
    DB_PASSWORD=password
    

    查询构建器

    查询构建器提供了流畅、直观的接口来构建和执行数据库查询。

    基本使用

    use function db;
    

    // 获取查询构建器 $query = db('users');

    // 查询所有记录 $users = db('users')->get();

    // 查询单条记录 $user = db('users')->where('id', 1)->first();

    // 条件查询 $activeUsers = db('users') ->where('status', 'active') ->where('age', '>', 18) ->get();

    详细文档

    完整的查询构建器使用指南,请参考:查询构建器文档

    ORM 模型

    ORM 提供了 ActiveRecord 风格的模型系统,支持模型关联、事件、作用域等高级特性。

    基本使用

    use App\Index\Model\User;
    

    // 查找用户 $user = User::find(1);

    // 创建用户 $user = User::create([ 'name' => 'John Doe', 'email' => 'john@example.com', ]);

    // 更新用户 $user->name = 'Jane Doe'; $user->save();

    // 删除用户 $user->delete();

    详细文档

    完整的 ORM 使用指南,请参考:ORM 使用指南

    数据库迁移

    数据库迁移提供了版本化的数据库结构管理。

    创建迁移

    php console make:migration create_users_table
    

    编写迁移

    <?php
    use Unicode\Framework\Database\Migration;
    

    class CreateUsersTable extends Migration { public function up(): void { $this->table('users', function($table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamps(); }); }

    public function down(): void { $this->dropTable('users'); } }

    运行迁移

    php console migrate
    php console migrate:rollback
    php console migrate:refresh
    

    详细文档

    完整的迁移使用指南,请参考:数据库迁移文档

    事务处理

    基本事务

    use function db_transaction;
    

    db_transaction(function($conn) { db('users')->insert(['name' => 'John']); db('orders')->insert(['user_id' => 1, 'amount' => 100]); // 如果任何操作失败,会自动回滚 });

    手动事务

    $conn = db()->connection();
    $conn->beginTransaction();
    

    try { db('users')->insert(['name' => 'John']); db('orders')->insert(['user_id' => 1, 'amount' => 100]); $conn->commit(); } catch (\Exception $e) { $conn->rollBack(); throw $e; }

    模型事务

    use App\Index\Model\User;
    use App\Index\Model\Order;
    

    db_transaction(function() { $user = User::create(['name' => 'John']); Order::create(['user_id' => $user->id, 'amount' => 100]); });

    多数据库支持

    使用不同连接

    // 使用默认连接
    $users = db('users')->get();
    

    // 使用指定连接 $users = db('users', 'mysql2')->get();

    模型使用不同连接

    class User extends Model
    {
        protected static function getConnection(): ConnectionInterface
        {
            return DatabaseManager::getInstance()->connection('mysql2');
        }
    }
    

    性能优化

    1. 使用索引

    // ✅ 推荐:使用索引字段查询
    $user = db('users')->where('email', 'user@example.com')->first();
    

    // ❌ 不推荐:使用非索引字段 $user = db('users')->where('name', 'John')->first();

    2. 只查询需要的字段

    // ✅ 推荐:只查询需要的字段
    $users = db('users')
        ->select(['id', 'name', 'email'])
        ->get();
    

    // ❌ 不推荐:查询所有字段 $users = db('users')->get();

    3. 使用分页

    // ✅ 推荐:使用分页
    $users = db('users')
        ->offset(0)
        ->limit(20)
        ->get();
    

    // ❌ 不推荐:一次性加载所有数据 $users = db('users')->get();

    4. 避免 N+1 查询

    // ❌ 错误:N+1 查询
    $users = db('users')->get();
    foreach ($users as $user) {
        $orders = db('orders')->where('user_id', $user->id)->get();
    }
    

    // ✅ 正确:使用 JOIN $users = db('users') ->leftJoin('orders', 'users.id', '=', 'orders.user_id') ->select('users.', 'orders.') ->get();

    // ✅ 正确:使用 ORM 预加载 $users = User::with('orders')->get();

    最佳实践

    1. 使用 ORM 模型

    对于复杂的业务逻辑,推荐使用 ORM 模型而不是直接使用查询构建器:

    // ✅ 推荐:使用模型
    $user = User::find(1);
    $user->name = 'New Name';
    $user->save();
    

    // ❌ 不推荐:直接使用查询构建器 db('users')->where('id', 1)->update(['name' => 'New Name']);

    2. 使用事务保证数据一致性

    // ✅ 推荐:使用事务
    db_transaction(function() {
        $user = User::create(['name' => 'John']);
        Order::create(['user_id' => $user->id, 'amount' => 100]);
    });
    

    3. 使用迁移管理数据库结构

    // ✅ 推荐:使用迁移
    // 不要直接修改数据库结构,而是创建迁移文件
    

    4. 合理使用批量操作

    // ✅ 推荐:批量插入
    db('users')->insert([
        ['name' => 'John', 'email' => 'john@example.com'],
        ['name' => 'Jane', 'email' => 'jane@example.com'],
    ]);
    

    // ❌ 不推荐:循环插入 foreach ($users as $user) { db('users')->insert($user); }

    相关文档

  • 查询构建器 - 详细的查询构建器使用指南
  • ORM 使用指南 - 完整的 ORM 模型使用文档
  • 数据库迁移 - 数据库迁移系统说明