数据库系统
最后更新: 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);
}