laravel的迁移文件

1. 迁移是什么?

迁移就像是对数据库进行的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构。迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构。如果团队中有个成员在他本地的数据库环境中手动的添加了某个字段,那么你将会面对如何解决数据库迁移的问题。

Laravel 的 Schema facade 提供了数据库相关的支持,可以在所有 Laravel 支持的数据库管理系统中创建和操作表

2. 迁移的使用

生成迁移

使用 make:migration Artisan 命令 命令来创建迁移(命名规则使用create_小写表名_table):

php artisan make:migration create_users_table

迁移转储(迁移合并)

随着时间,你构建的应用程序中的迁移会积累的越来越多。这会使目录变得臃肿,甚至会有数百个迁移文件。所以,如果你愿意,你可以将若干个迁移文件,压缩到单个 SQL 文件中。进行这个操作,需要执行的命令是:schema:dump。

php artisan schema:dump
// 上面示例为转储但不删除原有迁移文件,下面示例为转储且删除原有迁移文件
php artisan schema:dump --prune

迁移的操作方法

面对的迁移的操作有两个方法: up 和 down。方法 up 的作用是向数据库中添加新的表或列或索引,而 down 的方法,就是 up 方法的反向操作。

在这两种方法中,您可以使用 Laravel 的 Schema 生成器显式地创建和修改表。要了解 Schema 生成器上可用的所有方法,请查看其文档。例如,以下迁移将创建一个 flights 表:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFlightsTable extends Migration
     * 运行迁移
     * @return void
    public function up()
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
     * 回滚迁移
     * @return void
    public function down()
        Schema::drop('flights');
}

执行迁移

执行以下 migrate Artisan 命令,来执行未执行过的迁移:

php artisan migrate

回滚迁移

要回滚到最后一次操作,你可以使用 rollback 命令。此命令会回滚到最后 「一批」 的迁移,这可能会包含多个迁移文件:

php artisan migrate:rollback

通过向 rollback 命令加上 step 参数,可以回滚指定数量的迁移。例如,以下命令将回滚最后五个迁移:

php artisan migrate:rollback --step=5

如果您在迁移后觉得有误,可以使用重置命令 migrate:reset ,回滚刚才进行的所有迁移操作,以恢复到上一次迁移状态。

示例:

php artisan migrate:reset

创建数据表

接下来我们将使用 Schema 的 create 方法,创建一个新的数据表。 create 方法中可以接受两个参数,一个是表格的名称,第二个是 Closure,作用是可以在定义一个新数据表的时候接受 Blueprint 对象。

Schema::create('users', function (Blueprint $table) {
    $table->id();
});

重命名 / 删除数据表

若要重命名数据表,可以使用 rename 方法:

Schema::rename($from, $to);

删除一个已存在的数据表, 可使用 drop 或 dropIfExists 方法:

Schema::drop('users');
Schema::dropIfExists('users');

可用的字段类型

数据库结构生成器包含构建表时可以指定的各种字段类型:

命令 说明

$table->id();	$table->bigIncrements('id') 的别名
$table->foreignId('user_id');	$table->unsignedBigInteger('user_id') 的别名
$table->bigIncrements('id');	递增 ID(主键),相当于「UNSIGNED BIG INTEGER」
$table->bigInteger('votes');	相当于 BIGINT
$table->binary('data');	相当于 BLOB
$table->boolean('confirmed');	相当于 BOOLEAN
$table->char('name', 100);	相当于带有长度的 CHAR
$table->date('created_at');	相当于 DATE
$table->dateTime('created_at', 0);	相当于 DATETIME ,可以指定位数
$table->dateTimeTz('created_at', 0);	相当于 DATETIME (带时区) ,可以指定位数
$table->decimal('amount', 8, 2);	相当于 DECIMAL,可以指定总位数和小数位数
$table->double('amount', 8, 2);	相当于 DOUBLE,可以指定总位数和小数位数
$table->enum('level', ['easy', 'hard']);	相当于 ENUM
$table->float('amount', 8, 2);	相当于 FLOAT,可以指定总位数和小数位数
$table->geometry('positions');	相当于 GEOMETRY
$table->geometryCollection('positions');	相当于 GEOMETRYCOLLECTION
$table->increments('id');	递增 ID(主键),相当于 UNSIGNED INTEGER
$table->integer('votes');	相当于 INTEGER
$table->ipAddress('visitor');	相当于 IP 地址
$table->json('options');	相当于 JSON
$table->jsonb('options');	相当于 JSONB
$table->lineString('positions');	相当于 LINESTRING
$table->longText('description');	相当于 LONGTEXT
$table->macAddress('device');	相当于 MAC 地址
$table->mediumIncrements('id');	递增 ID(主键),相当于 UNSIGNED MEDIUMINT
$table->mediumInteger('votes');	相当于 MEDIUMINT
$table->mediumText('description');	相当于 MEDIUMTEXT
$table->morphs('taggable');	相当于加入递增 UNSIGNED BIGINT 类型的 taggable_id 与字符串类型的 taggable_type
$table->uuidMorphs('taggable');	相当于添加一个 CHAR (36) 类型的 taggable_id 字段和 VARCHAR (255) UUID 类型的 taggable_type
$table->multiLineString('positions');	相当于 MULTILINESTRING
$table->multiPoint('positions');	相当于 MULTIPOINT
$table->multiPolygon('positions');	相当于 MULTIPOLYGON
$table->nullableMorphs('taggable');	添加一个可以为空版本的 morphs() 字段.
$table->nullableUuidMorphs('taggable');	添加一个可以为空版本的 uuidMorphs() 字段
$table->nullableTimestamps(0);	timestamps() 方法的别名
$table->point('position');	相当于 POINT
$table->polygon('positions');	相当于 POLYGON
$table->rememberToken();	添加一个允许空值的 VARCHAR (100) 类型的 remember_token 字段
$table->set('flavors', ['strawberry', 'vanilla']);	相当于 SET
$table->smallIncrements('id');	递增 ID(主键),相当于 UNSIGNED SMALLINT
$table->smallInteger('votes');	相当于 SMALLINT
$table->softDeletes('deleted_at', 0);	相当于为软删除添加一个可空的 deleted_at 字段
$table->softDeletesTz('deleted_at', 0);	相当于为软删除添加一个可空的 带时区的 deleted_at 字段
$table->string('name', 100);	相当于指定长度的 VARCHAR
$table->text('description');	相当于 TEXT
$table->time('sunrise', 0);	相当于指定位数的 TIME
$table->timeTz('sunrise', 0);	相当于指定位数带时区的 TIME
$table->timestamp('added_on', 0);	相当于指定位数的 TIMESTAMP
$table->timestampTz('added_on', 0);	相当于指定位数带时区的 TIMESTAMP
$table->timestamps(0);	相当于添加可空的 TIMESTAMP 类型的 created_at 和 updated_at
$table->timestampsTz(0);	相当于添加指定时区的可空的 TIMESTAMP 类型的 created_at 和 updated_at
$table->tinyIncrements('id');	相当于自动递增 UNSIGNED TINYINT
$table->tinyInteger('votes');	相当于 TINYINT
$table->unsignedBigInteger('votes');	相当于 UNSIGNED BIGINT
$table->unsignedDecimal('amount', 8, 2);	相当于 UNSIGNED DECIMAL ,可以指定总位数和小数位数
$table->unsignedInteger('votes');	相当于 UNSIGNED INTEGER
$table->unsignedMediumInteger('votes');	相当于 UNSIGNED MEDIUMINT
$table->unsignedSmallInteger('votes');	相当于 UNSIGNED SMALLINT
$table->unsignedTinyInteger('votes');	相当于 UNSIGNED TINYINT
$table->uuid('id');	相当于 UUID
$table->year('birth_year');	相当于 YEAR

索引

创建索引

结构生成器支持多种类型的索引。下面的例子中新建了一个值唯一的 email 字段。我们可以将 unique 方法链式地添加到字段定义上来创建索引:

$table->string('email')->unique();

或者,你也可以在定义完字段之后创建索引。例如:

$table->unique('email');

你甚至可以将数组传递给索引方法来创建一个复合(或合成)索引:

$table->index(['account_id', 'created_at']);

Laravel 会自动生成一个合理的索引名称,但你也可以传递第二个参数来自定义索引名称:

$table->unique('email', 'unique_email');

可用的索引类型

每个索引方法都接受一个可选的第二个参数来指定索引的名称。如果省略,名称将根据表和列的名称生成。

命令 说明

$table->primary('id');	添加主键
$table->primary(['id', 'parent_id']);	添加复合键
$table->unique('email');	添加唯一索引
$table->index('state');	添加普通索引