laravel 数据库迁移

1. 介绍

迁移的作用就是编程式的创建应用数据库的结构

2. 创建迁移

php artisan make:migration create_users_table

新创建的迁移会放在 database/migrations 目录 ,如 2014_10_12_000000_create_users_table.php

文件名中的时间字段用来让 Laravel 确认迁移顺序 ,即 up 时按时间升序执行 ,down 时按降序执行

选项 说明
--create 指定迁移表的名称
--table 迁移时是否创建新数据表

3. 迁移结构

bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

迁移类中有两个方法 up() 和 down()

方法 说明
up() 新增数据库中的数据表 、字段 、索引等
down() down() 方法应该与 up() 执行的操作相反 ,即回滚

4. 表操作

4.1 创建表

// 使用 create() 方法创建新表
/**
 * @param $tablename 表名称
 * @param $callback 闭包 ,用于定义表的列
 */
Scheam::create('tablename', function(Blueprint $table){
    // 设置表属性
    $table->engine = 'InnoDB';
    $table->charset = 'utf8';
    $table->collation = 'utf8_unicode_ci';
    $table->temporary();
    // 创建列
});

4.2 操作表

Schema::rename('old_table_name', 'new_table_name');
Schema::drop('table_name');
// 删除
Schema::dropIfExists('table_name');

5. 列操作

/**
 * @param $tablename 表名称
 * @param $callback 闭包 ,用于定义表的列
 */
Scheam::create('tablename', function(Blueprint $table){
    // 创建列
    $table->string('name');
});

5.1 整型列

方法 说明
integer(colName) 添加 int 列
tinyInteger(colName) 添加 tinyint 列
smallInteger(colName) 添加 smallint 列
mediumInteger(colName) 添加 mediumint 列
bigInteger(colName) 添加 bigint 列

5.2 文本列

方法 说明
string(colName, length) 添加 VARCAHR 列
char(colName, length) 添加 CHAR 列
text(colName) 添加 TEXT 列
mediumText(colName) 添加 MEDIUMTEXT 列
longText(colName) 添加 LONGTEXT 列

5.3 二进制列

方法 说明
binary(colName) 添加 BLOB 列

5.4 布尔列

方法 说明
boolean(colName) 添加 BOOLEAN 列( MySQL 中是 TINYINT(1) )

5.5 时间列

方法 说明
datetime(colName) 添加 DATETIME 列
time(colName) 添加 TIME 列
timestamp(colName) 添加 TIMESTAMP 列
timestamps() 添加名为 created_at 的时间戳列
nullableTimestamps() 添加名为 updated_at 的时间戳列

5.6 浮点型列

方法 说明
decimal(colName, precision, scale) 添加 DECIMAL 列
double(colName, disits, decimal) 添加 DOUBLE 列
float(colName) 添加 FLOAT 列

5.7 枚举列

方法 说明
enum(colName, [choiceOne, choiceTwo]) 添加 ENUM 列

5.8 主键列

方法 说明
increments(colName) 添加无符号 INT 型自增主键
bigIncrements(colName) 添加无符号 LONGINT 型自增主键

5.9 其他列

方法 说明
uuid(colName) 添加 UUID 列( MySQL 中是 CHAR(36) )
rememberToken() 为用户 "remember me" 的令牌添加一个 remember_token 类型列( VARCHAR(100) )
softDeletes() 为包含软删除的用户添加一个 deleted_at 时间戳

6. 设置列的属性

方法 说明
nullable() 允许在列中插入 NULL
default('default value') 默认值
unsigned() 无符号
first() 按列顺序将列放到首列( 仅支持 MySQL )
after(colName) 按列顺序将当前列放到 colName 列后面
unique() 添加 UNIQUE 索引
primary() 添加主键索引
index() 添加基本索引
comment('comment') 添加注释

7. 修改列

修改列之前请确保将 doctrine/dbal 依赖添加到 composer.json 文件中

composer require doctrine/dbal

Schema::table('users', function ($table) {
    // 跟创建列一样 ,只要在最后调用 change() 方法就行了
    $table->string('name', 100)->change();
    $table->string('email')->nullable()->change();
    // 重命名
    $table->renameColumn('promoted', 'is_promoted');
    // 删除列
    $table->dropColumn('votes');
});

8. 索引和外键

8.1 添加索引

// 设置主键
$table->primary('id');
// 复合主键
$table->primary(['frisr_name', 'last_name']);
// 唯一索引
$table->unique('email');
// 基本索引
$table->index('amount');

8.2 删除索引

// 删除主键索引
$table->dropPrimary('id');
// 删除唯一索引
$table->dropUnique('email');
// 删除基本索引
$table->dropIndex('amount');
// 如果传递一个数组给 dropIndex() ,它会根据生成规则猜测索引名称
$table->dropIndex(['emial', 'amount']);

8.3 外键

// foreign() 和 references() 设置外键
$table->foreign('user_id')
    ->references('id')
    ->on('users')
    ->onDelete('cascade');
// onUpdate() 和 onDelete() 可以声明外键限制

// 删除外键
$table->dropForeign('contacts_user_id_foreign');

9. 运行迁移

命令 说明
migrate 运行所有迁移
migrate:rollback 回滚上一次的迁移
migrate:reset 回滚所有迁移
migrate:refresh 回滚所有迁移并重新运行所有迁移
migrate:fresh 删除所有表并重新运行所有迁移
migrate:status 显示每次迁移的状态
migrate:install 创建迁移存储库
# 回滚指定次数的迁移
migrate:rollback --step=2

# 运行指定迁移
migrate --path=/database/migrations/filename

你可能感兴趣的:(laravel 数据库迁移)