数据库与 ORM
PDO、mysqli、ORM、迁移、事务。
35 分钟
数据库与 ORM
php-essentials 已用 PDO 连接 MySQL;本课扩展 ORM、迁移与事务。对照 Java JPA 见 spring-boot-essentials;路径 /roadmaps/php。
学习目标
- 对比 PDO 与 mysqli 的使用场景
- 用 Eloquent 或 Doctrine 做 ORM 映射
- 理解迁移与事务保证数据一致性
PDO 事务
<?php
declare(strict_types=1);
$pdo->beginTransaction();
try {
$pdo->prepare('INSERT INTO lessons (slug, title) VALUES (?, ?)')
->execute(['pha-database', '数据库与 ORM']);
$pdo->prepare('UPDATE tracks SET lesson_count = lesson_count + 1 WHERE slug = ?')
->execute(['php-advanced-essentials']);
$pdo->commit();
} catch (Throwable $e) {
$pdo->rollBack();
throw $e;
}
多表写入须在同一事务中;失败则回滚。
Eloquent 示例(Laravel)
use App\Models\Lesson;
$lesson = Lesson::create([
'slug' => 'pha-database',
'title' => '数据库与 ORM',
'track_id' => 1,
]);
$found = Lesson::where('slug', 'pha-database')->first();
Eloquent 用 Active Record 模式;模型即表映射。
迁移
// database/migrations/2024_01_01_create_lessons_table.php
Schema::create('lessons', function (Blueprint $table) {
$table->id();
$table->string('slug')->unique();
$table->string('title');
$table->foreignId('track_id')->constrained();
$table->timestamps();
});
迁移把表结构版本化,团队可重复部署;类似 Flyway / Liquibase。
mysqli 与 PDO
| PDO | mysqli | |
|---|---|---|
| 数据库 | 多种 | 仅 MySQL |
| 预处理 | 支持 | 支持 |
| 推荐 | 新项目首选 | 遗留项目维护 |
练习
- 写迁移创建
lessons表(slug 唯一、含 timestamps) - 用 PDO 事务:插入课时并更新 track 计数
- 用 Eloquent 或 Query Builder 实现按 track 分页查询
小结
PDO 打底、ORM 提效、迁移管结构、事务保一致。 下一课性能与运维。
加载本节练习…