Laravel新手求教:Blueprint类与数据库迁移详细解析
Laravel Blueprint类与数据库迁移详解
一、Schema门面:数据库结构操作的入口
Schema是Laravel提供的数据库结构操作门面,是你与数据库表结构交互的核心入口。常用核心方法:
Schema::create($tableName, Closure $callback):创建新表,回调接收Blueprint实例Schema::table($tableName, Closure $callback):修改已有表Schema::drop($tableName):删除指定表Schema::dropIfExists($tableName):表存在则删除Schema::hasTable($tableName):检查表是否存在Schema::hasColumn($tableName, $column):检查表中是否存在指定字段
二、Blueprint类:定义表结构的"蓝图"
Blueprint是构建表结构的核心类,所有字段、约束、索引等表结构细节都通过它定义。
2.1 基础创建示例
创建users表的迁移代码示例:
public function up() { Schema::create('users', function (Blueprint $table) { // 自增bigint主键 $table->id(); // 字符串字段,默认长度255 $table->string('name'); // 唯一邮箱字段 $table->string('email')->unique(); // 密码哈希存储字段 $table->string('password'); // 自动添加created_at、updated_at时间戳字段 $table->timestamps(); }); } public function down() { // 回滚时删除表 Schema::dropIfExists('users'); }
up()方法定义迁移执行逻辑,down()定义回滚时的反向操作。
2.2 常用字段类型
Blueprint覆盖了几乎所有数据库支持的字段类型,高频使用的类型包括:
- 主键与标识:
id():等价于bigIncrements('id'),自增bigint主键uuid():uuid类型主键primary($columns):设置指定字段为主键(支持复合主键,传入数组)
- 字符串与文本:
string($name, $length = 255):固定长度字符串text($name):常规长文本(对应数据库TEXT类型)longText($name):超长文本(对应数据库LONGTEXT类型)
- 数值类型:
integer($name):int类型整数float($name, $precision = 8, $scale = 2):浮点型数值decimal($name, $total = 8, $places = 2):高精度小数
- 日期时间:
timestamp($name):时间戳字段date($name):纯日期字段datetime($name):日期时间字段softDeletes():添加deleted_at软删除字段
- 特殊类型:
boolean($name):布尔字段enum($name, array $allowedValues):枚举字段json($name):JSON类型字段binary($name):二进制字段
2.3 字段约束与索引
约束和索引是保证数据完整性的关键,Blueprint提供了便捷的链式调用:
- 非空约束:默认字段为非空,允许空值用
->nullable() - 默认值:
->default($value),例如$table->boolean('is_active')->default(true) - 唯一约束:
->unique(),确保字段值全局唯一 - 外键约束:关联其他表主键,示例:
$table->unsignedBigInteger('post_id'); $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');onDelete('cascade')表示删除关联posts表记录时,自动删除当前表的关联记录 - 索引:
->index($columns):为字段添加普通索引->fullText($columns):添加全文索引(仅部分数据库支持)->unique($columns):同时添加唯一约束和索引
2.4 表级操作
除了字段定义,Blueprint还支持表级配置与修改:
- 设置存储引擎:
$table->engine = 'InnoDB'; - 设置字符集与排序规则:
$table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci'; - 删除字段:
$table->dropColumn($column),支持批量删除:$table->dropColumn(['column1', 'column2']) - 重命名字段:
$table->renameColumn('old_name', 'new_name')(部分数据库需安装额外扩展) - 重命名表:通过Schema门面执行
Schema::rename('old_table', 'new_table')
三、迁移核心工作流
- 创建迁移文件:
运行Artisan命令生成迁移:# 创建新表迁移 php artisan make:migration create_users_table # 修改已有表的迁移 php artisan make:migration add_phone_to_users_table --table=users - 编辑迁移文件:编写
up()和down()逻辑 - 执行迁移:
运行所有未执行的迁移php artisan migrate - 回滚迁移:
# 回滚最后一次迁移 php artisan migrate:rollback # 回滚指定批次的迁移 php artisan migrate:rollback --step=3 # 回滚所有迁移 php artisan migrate:reset - 重置并重新执行:
# 删除所有表并重新执行迁移 php artisan migrate:fresh # 重置迁移并填充测试数据 php artisan migrate:fresh --seed
四、进阶实用技巧
- 条件迁移:避免重复执行操作,示例:
public function up() { if (!Schema::hasColumn('users', 'phone')) { Schema::table('users', function (Blueprint $table) { $table->string('phone')->nullable(); }); } } - 批量字段操作:快速添加多个同类型字段:
$fields = ['address', 'city', 'country']; Schema::table('users', function (Blueprint $table) use ($fields) { foreach ($fields as $field) { $table->string($field)->nullable(); } }); - 带时区的时间戳:用
timestampsTz()替代timestamps(),存储带时区的时间戳 - 临时禁用外键检查:迁移时若有外键关联,可临时禁用约束:
Schema::disableForeignKeyConstraints(); // 执行删除表或批量操作 Schema::enableForeignKeyConstraints();
内容的提问来源于stack exchange,提问作者Amrudin
相关产品推荐
相关产品推荐

