数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行alter table xxx add .. 的方式直接修改,但是这么做有些弊端,比如在开发阶段,你自己的库表修改了,还要把这句sql语句传给别人再执行一遍,这在多人协同开发时不是一种好的方式.那有没有一种方式能让我们对数据库 库表的修改做一些简单的版本控制,同时能让其他人很方便的同步我们对数据库的修改呢? 答案是我们可以使用Laravel 内置的Migrations .

对数据库的管理包括哪些部分?

其实Laravel对数据库的版本管理主要包括两部门: 数据库结构的管理 和数据的管理.

  1. 数据库结构的管理: 主要是对数据库结构进行管理,比如新增了一张表,某张表增加了一个字段等等.

  2. 数据的管理: 这个主要是管理表中的数据,生成一些填充数据,解决我们开发调试时没有测试数据的问题.

数据库结构管理

要记录下我们对数据库结构所做的更改,我们可以使用Laravel内置 Migrations.

下面我们就走个小例子,看看如果要在数据库中新增一个库表具体该怎么做:

1. 创建一个数据库

Laravel要和我们的数据库连接,首先要有个对应的数据库,你可以在PHPMyAdmin或者navicat for mysql等管理工具新建一张表:

CREATE DATABASE `laravel5`;

2. 配置数据库的连接信息

我们要使用Laravel管理数据库,第一步当然是要能连接上数据库,数据库的连接配置信息是放在根目录下的.env文件中,这里我连接的是本地的数据库:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel5 DB_USERNAME=root DB_PASSWORD=123456

3. 安装LaravelMigrations

如果我们是第一次使用Migrations,那就要先执行migrate:install命令来支持数据库的迁移,进入到项目的根目录,执行安装命令:

php artisan migrate:install

这句话执行了以后,Laravel会在数据库新建一张migrations表,用这张表来记录我们每次对数据库做的更改:

4. 创建迁移文件

以上三步是我们在首次使用Migrations是需要做的,相当于初始化工作,以后每次的更改只需要做下面的工作,好,我们接着往下走.我们的目标是创建一张表,比如说就创建一张商品表goods,首先我们用artisan命令来创建一个对应的迁移文件:

php artisan make:migration create_goods_table --create=goods

执行信息如下:

Created Migration: 2017_03_05_214805_create_goods_table

这句话解释一下, make:migration 是迁移命令,create_goods_table 是迁移文件的文件名,--create=goods是该命令携带的参数,意思是创建一张表,并且表名是goods,这句话执行完毕以后, 我们可以在database\migrations目录下看到多个一个文件:

5. 编辑迁移文件:

我们首先看一下这个文件的结构,

<?phpuse Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateGoodsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('goods', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('goods'); } } 

解释一下这个文件:

该文件包括两个函数,updown,up方法是当执行迁移动作时要执行的方法,down方法是在进行数据库回滚的时候执行的方法,因此updown是一对反方法,up要创建一张表,down就是要删除一张表,同理,当up中是新增一个字段时,down方法就是删除一个字段了.

我们再来看一下up方法中的内容

Schema::create('goods', function (Blueprint $table) {..}
这里调用Schema操作表的方法来创建表,第二个参数是一个闭包,$table可以用来定义数据库表的结构:

$table->increments('id');
创建一个自增长的字段,字段名默认叫id,当然你也可以改成其他名字.

$table->timestamps();
这里会在表中创建created_at 和 updated_at 字段.

我们所需要的当然不止这么简单,下面我们就增加一些我们需要的字段:

    public function up() { Schema::create('goods', function (Blueprint $table) { $table->increments('id'); $table->integer('goods_sn'); //商品货号 $table->string('goods_name');//商品名 $table->decimal('prize', 10, 2); //价格 $table->timestamps(); }); } 

up方法中新增了三个字段,关于更多的字段类型选择以及字段修饰,可以去查看一下文档:数据库: 迁移
好了,要对数据库做的更改都定义好了,下面就是真正的执行迁移工作了:

6. 执行迁移:

在执行迁移之前,还需要执行一个命令composer dump-autoload,这个命令的主要作用是让 composer 更新autoload_classmap 的内容,包含到我们新建的文件,具体可参考下这篇文章深入 Composer autoload

composer dump-autoload

然后执行

php artisan migrate

输出结果为:

然后我们查看一下数据库,发现goods 表生成了!

同理,如果你想在这个表中新增一个字段,可以从第四步到第六步再走一遍,只不过这次不再是创建表,但是流程是一样的.

7. 数据库回滚:

有时候我们想撤销对数据库做的修改,比如上面新增了一张表,我现在想删除那张表怎么办,这个时候就可以使用migrations的回滚rollback命令:

php artisan migrate:rollback

注意,这个命令并不是回滚所有的migrate操作,而是回滚你上一次的操作,如果你想执行所有的回滚,可以使用reset命令,执行后会按照迁移文件的时间排序执行所有文件的down方法;

php artisan migrate:reset

8. 重建整个数据库

使用refresh命令,可以回滚所有的操作,然后再次执行所有的迁移,实际就是按照时间排序执行所有的down方法,然后再执行所有的up方法;

php artisan migrate:refresh


数据填充

1. 生成Seeder文件:

现在我们已经建立起了数据库表的结构,但是现在表中并没有测试数据,如何制造一些假数据方便我们测试呢?在Laravel中我们可以Seeder+Faker来填充假数据;

假设我们想对goods表填充一些数据.我们第一步要做的工作是先有一个对应于goods表的Seeder文件,让我们通过命令生成一个:

php artisan make:seeder GoodsTableSeeder

执行完后会在database\seeds 目录下看到生成的GoodsTableSeeder文件:

<?phpuse Illuminate\Database\Seeder; class GoodsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // } } 

可以看到,类中只有一个默认的run方法,这个run方法就是我们执行数据填充的地方.

2. 编辑Seeder文件:

2.1 简单的数据填充

我们先尝试着做一次最简单的数据填充,直接使用DB类来插入一条数据,编辑run方法:

    public function run() { DB::table('goods')->insert([ 'goods_sn' => 10001, 'goods_name' => '加多宝凉茶', 'prize' => 3.5 ]); }

现在说了半天数据并没有进入数据库啊!莫慌,就差最后一步了: 执行seed命令:

php artisan db:seed --class=GoodsTableSeeder

执行完之后,就会发现数据已经填充到数据库了:

2.2 使用模型工厂进行批量填充

上面我们简单插入了一条数据,但是明显不过瘾,如果我们想一次插入100条数据,总不能手写100遍吧,这个问题我们可以使用模型工厂来解决:
当然,使用模型工厂之前,必须要有个对应于goods表的一个Model类,让我们执行命令生成一个:

php artisan make:model Models\Good

生成的Model类 Good:

<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Model; class Good extends Model { //表示对应于表goods protected $table = 'goods'; } 

模型工厂对应于database\factories中的ModelFactory.php文件,在这个文件中,我们新增一段代码:

$factory->define(\App\Models\Good::class, function (\Faker\Generator $faker) {return ['goods_sn' => $faker->numberBetween(10001,20000), 'goods_name' =>$faker->name, 'prize' => $faker->numberBetween(20,50) ]; });

define 方法中第一个参数表示关联Good模型类,第二个参数传入的是$faker,Faker是一个开源类库,主要用于生成一些测试数据,比如电话号码,人名,IP地址等等,这里Laravel内置了Faker,因此可以直接使用.
在方法中,对应于每个必须的字段,填充上对应的值;

然后回到GoodsTableSeeder.php文件,编辑run方法:

    public function run() { factory(Good::class)->times(10)->create(); //create()表示插入数据库中 //factory(Good::class)->times(10)->make(); //make()表示只生成对象,不插入库表中 }

这里调用factory方法,times表示要执行的次数.之后执行命令:

php artisan db:seed --class=GoodsTableSeeder

执行完毕之后,就会发现数据表中新增了十条数据.

2.4 单次执行全部seeder

上面的操作虽然可以完成对一张表批量插入多条数据,但是如果我有多个表都要进来批量插入数据,难道要执行多次db:seed xxx,当然不用这样,database\seeds目录下有个DatabaseSeeder.php文件,这个文件的作用就是对多个seeder进行管理的,在这里可以调用其他的字Seeder类,指定他们的执行顺序:

<?phpuse Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Model::unguard(); //解除模型的批量填充限制 $this->call(UsersTableSeeder::class); $this->call(StatusesTableSeeder::class); $this->call(RolesTableSeeder::class); $this->call(AdminUsersTableSeeder::class); Model::reguard(); } } 

然后我们再执行seed命令:

php artisan db:seed

这个命令的作用就是执行DatabaseSeeder run方法,因此只需要执行上面的命令,就可执行所有表的填充命令了!

其实还有个最为强大的命令:

php artisan migrate:refresh --seed

这个命令主要做了三件事:

  1. 执行所有的回滚,也就是migrations目录下所有文件的down方法,执行的时候按照时间顺序.

  2. 所有回滚执行完毕后,执行所有的迁移,也就是按照时间顺序执行所有的up方法.

  3. 执行所有的数据填充,也就是执行DatabaseSeeder 中的run方法.如果在run方法中没有调用其他的seeder,则这个seederrun方法不会被执行.

定义路由在web.php中

转载于:https://www.cnblogs.com/zhangtianle/p/7682055.html

Laravel 实践之路: 数据库迁移与数据填充相关推荐

  1. php数据迁移脚本,Laravel中数据迁移与数据填充的详细步骤

    前言 这是一篇基础教程,对标 Laravel 文档中的数据迁移和数据填充,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍把. 关于Laravel数据库迁移的理解 最初看到laravel框 ...

  2. php 值转移,迁移与数据填充 - Migrations Seeding

    迁移与数据填充 介绍 迁移是一种数据库的版本控制.可以让团队在修改数据库结构的同时,保持彼此的进度一致.迁移通常会和 结构生成器 一起使用,可以简单的管理数据库结构. 建立迁移文件 使用 Artisa ...

  3. OpenCV实践之路——人脸识别之一数据收集和预处理

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/51386949 微博:http ...

  4. laravel 框架中使用数据库迁移添加注释

    laravel 框架中数据库迁移添加注释 在使用laravel框架过程中,估计很多人都有用过数据库迁移文件.可能大家都会在建表时为字段添加注释.我在此要说明的是为表添加注释 首先我们需要引入larav ...

  5. 实践练习四:迁移 MySQL 数据到 OceanBase 集群

    练习目的 本次练习目的掌握从 MySQL 向 OceanBase 迁移数据的基本方法:mysqldump.datax .canal 等. 练习内容 请记录并分享下列内容: (必选)使用 mysqldu ...

  6. aws mysql 迁移_Amazon DMS 数据库迁移_数据迁移_云迁移-AWS云服务

    使用案例 同构数据库迁移 在同构数据库迁移中,源数据库和目标数据库采用相同或兼容的数据库引擎,例如从 Oracle 迁移至 Amazon RDS for Oracle.从 MySQL 迁移至 Amaz ...

  7. Laravel学习笔记四-数据库迁移和模型文件

    本节将学习使用artisan命令数据库迁移建表,模型文件的学习. 一.数据库迁移 二.模型文件 三.git checkout -f 命令应用 我们在开发中经常会遇到这样的情况,如果一个分支中提交了一个 ...

  8. 达梦数据库迁移oracle数据乱码,oracle迁移到达梦数据库之存储过程中char类型的不同处理...

    oracle迁移到dm之存储过程中char类型的不同处理 1.问题描述: oracle迁移到dm后,oracle正常使用的存储过程,在dm中使用报错:字符串截断 2.查找原因: 2.1 对比oracl ...

  9. laravel使用migrate操作数据库迁移

    数据库表单预创建 1.生成php文件 php artisan make:migration create_articles_table 2.执行php文件操作数据库 php artisan migra ...

最新文章

  1. hbase集群间数据迁移
  2. 工具栏,状态栏(VC_MFC)
  3. mac 键盘映射优化配置
  4. 计算机网络tcp三次握手,快速掌握_计算机网络_TCP_三次握手
  5. 数据格式转换(一)PDF转换技术
  6. 生成word_Word如何生成目录?3个步骤轻松掌握!
  7. Adobe reader 添加注释后,点击保存,强制要求另存为
  8. Oracle的Case When then end的用法
  9. php zend引擎解析原理,PHP内核分析-Zend引擎-栈结构及操作
  10. OAException Application FND Message Name FND NO DATABASE
  11. STM32/APM32 用DMA采集ADC1多通道--标准库
  12. xquery_使用XQuery查询DB2 XML数据
  13. 素数判断 isPrime
  14. 网易云的特色与优势?|网易云
  15. XSY #2815 净空
  16. 五分钟讲透开关电源buck降压基本原理
  17. 《算法》读书笔记(一)
  18. 大学生观看直播时长影响因素分析
  19. 服务器整体爆率如何修改,传奇私服如何调整爆率
  20. 《道德经》第二十六章

热门文章

  1. 【helloworld】-微信小程序开发教程-入门篇【1】
  2. 坐姿绳索划船 - 坐姿器械划船动作图解教程
  3. Android开发技术周报 Issue#81
  4. 低级键盘钩子,在WIN7以上版本的问题
  5. Dreamer 3.0 支持json、xml、文件上传
  6. winform下载网页源码
  7. wcf寄宿iis7是的 500错误
  8. 【笔记】2010-11-25记录
  9. mysql fnv算法_《高性能MySQL》读书笔记之创建高性能的索引
  10. Angular6自定义指令实现多图片上传预览