欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

[Laravel 5 教程学习笔记] 七、数据库迁移 Migrations 有大用

shiping1 的头像

迁移是一种数据库的版本控制。可以让团队在修改数据库结构的同时,保持彼此的进度一致。它是 Laravel 5 最强大的功能之一。

一般我们可以通过phpmyadmin或者Navicat等数据库管理工具来创建、修改数据表结构。如果就自己一个人的话还好,但是如果团队中有多个人,我们就需要导出表结构,然后传给团队中其他人,他们再把数据表结构导入他们的数据库,这时如果表中原来有数据的话就可能出现一些问题。而Laravel 5中的Migrations很好的避免了此问题。

 

Migrations把表结构存储为一个PHP类,通过调用其中的方法来创建、更改数据库。Migrations存放在在 database/migrations 目录中。初始情况下,其中包含了两个文件:***_create_users_table.php 和 ***_create_password_resets_table.php,分别是用户表和用户密码重置表。每个文件中都包含了 up() 和 down() 两个方法,一个用来创建、更改数据表,一个用来回滚操作,即撤 up() 中的操作。

创建迁移文件

使用 Artisan CLI 的 make:migrate 命令建立迁移文件:


  1. D:\wamp\www\laravel5>php artisan help make:migration

  2. Usage:

  3. make:migration [--create[="..."]] [--table[="..."]] name

  4.  

  5. Arguments:

  6. name The name of the migration

  7.  

  8. Options:

  9. --create The table to be created.

  10. --table The table to migrate.

  11. --help (-h) Display this help message

  12. --quiet (-q) Do not output any message

  13. --verbose (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

  14. --version (-V) Display this application version

  15. --ansi Force ANSI output

  16. --no-ansi Disable ANSI output

  17. --no-interaction (-n) Do not ask any interactive question

  18. --env The environment the command should run under.

其中 –create 是创建一个新表,而 –table 为修改指定表。如:


  1. php artisan make:migration create_users_table --create=users //创建users表

  2. php artisan make:migration add_votes_to_users_table --table=users //给users表增加votes字段

生成的迁移文件默认存放在 database/migrations 目录中,文件名会包含时间戳记,在执行迁移时用来决定顺序。

执行数据迁移

执行所有未执行的迁移


  1. php artisan migrate

注意: 如果在执行迁移时发生「class not found」错误,试着先执行 composer dump-autoload命令后再进行一次。

在线上环境 (Production) 中强制执行迁移

有些迁移操作是具有破坏性的,意味着可能让你遗失原本保存的数据。为了防止你在上线环境执行到这些迁移命令,你会被提示要在执行迁移前进行确认。加上 --force 参数执行强制迁移:


  1. php artisan migrate --force

回滚迁移

回滚上一次的迁移


  1. php artisan migrate:rollback

回滚所有迁移


  1. php artisan migrate:reset

回滚所有迁移并且再执行一次


  1. php artisan migrate:refresh

  2.  

  3. php artisan migrate:refresh --seed


上面是一些数据迁移的基本操作,下面是一个例子:

执行数据迁移:


  1. D:\wamp\www\laravel5>php artisan migrate

  2.  

  3. Migration table created successfully.

  4. Migrated: 2014_10_12_000000_create_users_table

  5. Migrated: 2014_10_12_100000_create_password_resets_table

此时查看数据库,会发现多出了migrationspassword_resetsusers三个表,migrations表是用来管理数据库迁移回滚等操作的,一般不要动这个表,而users表和password_resets表就是 database/migrations 目录原有的两个生成的表。

想修改users表中的name字段为username,执行回滚操作:


  1. D:\wamp\www\laravel5>php artisan migrate:rollback

  2. Rolled back: 2014_10_12_100000_create_password_resets_table

  3. Rolled back: 2014_10_12_000000_create_users_table

再次查看数据库,发现users表和password_resets表已经被删除。修改***_create_users_table.php文件,把name修改为username,之后再次支持数据库迁移。查看数据库users表,发现字段名已经变成了username。

新建articles迁移

创建一个存放博客的数据表:


  1. D:\wamp\www\laravel5>php artisan make:migration create_articles_table --create=articles

  2.  

  3. Created Migration: 2015_05_11_140813_create_articles_table

此时, database/migrations 目录中会多出一个***_create_articles_table.php文件:


  1. <?php

  2.  

  3. use Illuminate\Database\Schema\Blueprint;

  4. use Illuminate\Database\Migrations\Migration;

  5.  

  6. class CreateArticlesTable extends Migration {

  7.  

  8. /**

  9. * Run the migrations.

  10. *

  11. * @return void

  12. */

  13. public function up()

  14. {

  15. Schema::create('articles', function(Blueprint $table)

  16. {

  17. $table->increments('id');

  18. $table->timestamps();

  19. });

  20. }

  21.  

  22. /**

  23. * Reverse the migrations.

  24. *

  25. * @return void

  26. */

  27. public function down()

  28. {

  29. Schema::drop('articles');

  30. }

  31.  

  32. }

up() 方法中创建了一个自增ID,其中的 timestamps() 方法会生成 created_at 和updated_at 两个时间列。下面向其中增加一些列:


  1. public function up()

  2. {

  3. Schema::create('articles', function(Blueprint $table)

  4. {

  5. $table->increments('id');

  6. $table->string('title');

  7. $table->text('body');

  8. $table->timestamps();

  9. $table->timestamp('published_at');

  10. });

  11. }

执行数据库迁移:


  1. php artisan migrate

现在数据库就多出了一个articles表。现在想给表中增加一个excerpt字段,我们可以执行回滚,然后修改原来的文件再执行迁移,也可以创建一个新的迁移文件:


  1. php artisan make:migration add_excerpt_to_articles_table --table=articles

如果不加 --table 参数,则生成的迁移文件只包含基础代码。

修改新生成的文件:


  1. public function up()

  2. {

  3. Schema::table('articles', function(Blueprint $table)

  4. {

  5. $table->text('excerpt')->nullable();

  6. });

  7. }

  8. public function down()

  9. {

  10. Schema::table('articles', function(Blueprint $table)

  11. {

  12. $table->dropColumn('excerpt');

  13. });

  14. }

再次执行迁移:


  1. php artisan migrate

查看数据库,此时 excerpt 列已增加成功。



普通分类: