数据库迁移 & 数据填充

简介

Migrations是一种数据库版本控制功能.它允许团队开发者修改数据库结构,并使其保持最新状态.Migrations通常和结构生成器 配合使用来管理您的应用程序结构.

创建数据迁移

使用 Artisan 命令行的 migrate:make 命令创建一个迁移:(在命令行模式下使用)

php artisan migrate:make create_users_table

所有的迁移都被存放在 app/database/migrations 文件夹下,文件以时间戳命名以方便Laravel框架按时间来界定这些文件顺序.

您可以在创建迁移的时候使用 --path 选项,用来指定迁移文件存放的路径.该路径是你安装框架根目录的相对路径:

php artisan migrate:make foo --path=app/migrations

--table--create 选项用来指定表名以及是否创建一个新表:

php artisan migrate:make add_votes_to_user_table --table=users

php artisan migrate:make create_users_table --create=users

运行数据迁移

运行所有迁移(使你的所有表保持最新)

php artisan migrate

运行某个路径下的所有迁移(指定迁移文件路径)

php artisan migrate --path=app/foo/migrations

运行某个包下的所有迁移(安装或升级某个扩展包对应数据库时候使用)

php artisan migrate --package=vendor/package

注意: 如果在运行迁移的时候收到一个 "class not found" 的错误,请尝试运行 composer dump-autoload 命令.

在生产环境中强制使用数据迁移

有些迁移操作具有破坏性,会导致你丢失数据库中原有数据.为了防止你运行这样的命令造成不必要的破坏,这些命令运行的时候会询问你是否确定要这样做.如果你想运行这样的命令而不出现提示,可以使用 --force 选项:

php artisan migrate --force

回滚数据迁移(即使回滚,原有数据也被破坏了,只能回滚表结构,所以别拿这个功能当救命稻草)

回滚最后一次迁移

php artisan migrate:rollback

回滚所有迁移

php artisan migrate:reset

回滚所有迁移并重新运行数据迁移

php artisan migrate:refresh

php artisan migrate:refresh --seed

数据库填充

Laravel 可以非常简单的使用数据填充类(seed classes)帮你生成一些测试数据放到数据库中去.所有的数据填充类(seed classes)都存放在 app/database/seeds 路径下.数据填充类(seed classes)你可以随便命名,但最好遵循一些合理的约定,例如 UserTableSeeder 等. DatabaseSeeder是一个已经生成好的默认类(它将默认被执行,你也可以把这个当作例子).在这个类(DatabaseSeeder)中,你可以使用 call 方法来运行其他数据填充类,这样你就能控制数据填充的顺序了.

数据库填充类的例子

class DatabaseSeeder extends Seeder {

    public function run()
    {
        $this->call('UserTableSeeder');

        $this->command->info('User table seeded!');
    }

}

class UserTableSeeder extends Seeder {

    public function run()
    {
        DB::table('users')->delete();

        User::create(array('email' => 'foo@bar.com'));
    }

}

使用 Artisan 命令行的 db:seed 命令填充数据库:

php artisan db:seed

默认情况下 db:seed 命令运行的是 DatabaseSeeder 类, 这个类中可以(像上面的例子中那样)调用其他seed类. 但是你也可以使用 --class 选项来单独运行指定数据库填充类 :

php artisan db:seed --class=UserTableSeeder

您也可以使用 migrate:refresh 命令,这将回滚并重新运行所有数据库迁移:

php artisan migrate:refresh --seed