数据库:迁移
简介
数据库迁移就像是数据库的版本控制,可以让你的团队轻松修改并共享应用程序的数据库结构。迁移通常会搭配上 Laravel 的数据库结构构造器来让你方便地构建数据库结构。如果你曾经出现过让同事手动在数据库结构中添加字段的情况,数据库迁移可以解决你这个问题。
Laravel 的 Schema
facade 对所有 Laravel 支持的数据库系统提供了创建和操作数据表的相应支持。
生成迁移
使用 make:migration
Artisan 命令 来创建迁移:
php artisan make:migration create_users_table
新的迁移文件将会被放置在 database/migrations
目录中。每个迁移文件的名称都包含了一个时间戳,以便让 Laravel 确认迁移的顺序。
--table
和 --create
选项可用来指定数据表的名称,或是该迁移被执行时会创建的新数据表。这些选项需在预生成迁移文件时填入指定的数据表:
php artisan make:migration create_users_table --create=users
php artisan make:migration add_votes_to_users_table --table=users
如果你想为生成的迁移指定一个自定义输出路径,则可以在运行 make:migration
命令时添加 --path
选项。提供的路径必须是相对于应用程序的基本路径。
迁移结构
一个迁移类会包含两个方法: up
和 down
。 up
方法可为数据库添加新的数据表、字段或索引,而 down
方法则是 up
方法的逆操作。
你可以在这两个方法中使用 Laravel 数据库结构构造器来创建以及修改数据表。若要了解 数据库结构
构造器中的所有可用方法,可查阅它的文档。以下的迁移实例会创建一张 flights
数据表:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFlightsTable extends Migration
{
/**
* 运行数据库迁移。
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* 回滚数据库迁移。
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
}
运行迁移
使用 migrate
Artisan 命令,来运行所有未运行过的迁移:
php artisan migrate
如果你使用的是 Homestead virtual machine , 你需要在虚拟机中执行以上命令。
在线上环境强制执行迁移
一些迁移的操作是具有破坏性的,它们可能会导致数据丢失。为了保护线上环境的数据库,系统会在这些命令被运行之前显示确认提示。若要忽略此提示并强制运行命令,则可以使用 --force
标记:
php artisan migrate --force
回滚迁移
若要回滚最后一次迁移,则可以使用 rollback
命令。此命令是对上一次执行的「批量」迁移进行回滚,其中可能包括多个迁移文件:
php artisan migrate:rollback
在 rollback
命令后加上 step
参数,你可以限制回滚迁移的个数。例如,下面的命令将会回滚最后的 5 个迁移。
php artisan migrate:rollback --step=5
migrate:reset
命令可以回滚应用程序中的所有迁移:
php artisan migrate:reset
使用单个命令来执行回滚和迁移
migrate:refresh
命令不仅会回滚数据库的所有迁移还会接着运行 migrate
命令。所以此命令可以有效的重新创建整个数据库:
php artisan migrate:refresh
// 刷新数据库结构并执行数据填充
php artisan migrate:refresh --seed
使用 refresh
命令并加上 step
参数,你也可以限制执行回滚和再迁移的个数。比如,下面的命令会回滚并再迁移最后的 5 个迁移:
php artisan migrate:refresh --step=5
数据表
创建数据表
要创建一张新的数据表,则可以使用 Schema
facade 的 create
方法。create
方法接收两个参数。第一个参数为数据表的名称,第二个参数为一个 闭包
,此闭包会接收一个用于定义新数据表的 Blueprint
对象:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
});
当然,在创建数据表的时候,你也可以使用任何数据库结构构造器的 字段方法 来定义数据表的字段。
检查数据表或字段是否存在
你可以方便地使用 hasTable
和 hasColumn
方法来检查数据表或字段是否存在:
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
数据库连接与存储引擎
如果你想要在一个非默认的数据库连接中进行数据库结构操作,则可以使用 connection
方法:
Schema::connection('foo')->create('users', function (Blueprint $table) {
$table->increments('id');
});