Laravel 实践之路: 数据库迁移与数据填充
2017-03-07 14:59
447 查看
数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行
答案是我们可以使用
数据库结构的管理: 主要是对数据库结构进行管理,比如新增了一张表,某张表增加了一个字段等等.
数据的管理: 这个主要是管理表中的数据,生成一些填充数据,解决我们开发调试时没有测试数据的问题.
下面我们就走个小例子,看看如果要在数据库中新增一个库表具体该怎么做:
3. 安装
如果我们是第一次使用
这句话执行了以后,
执行信息如下:
这句话解释一下,
解释一下这个文件:
该文件包括两个函数,
我们再来看一下
这里调用
创建一个自增长的字段,字段名默认叫
这里会在表中创建
我们所需要的当然不止这么简单,下面我们就增加一些我们需要的字段:
好了,要对数据库做的更改都定义好了,下面就是真正的执行迁移工作了:
然后执行
输出结果为:
然后我们查看一下数据库,发现
同理,如果你想在这个表中新增一个字段,可以从第四步到第六步再走一遍,只不过这次不再是创建表,但是流程是一样的.
注意,这个命令并不是回滚所有的
1. 生成
现在我们已经建立起了数据库表的结构,但是现在表中并没有测试数据,如何制造一些假数据方便我们测试呢?在
假设我们想对
执行完后会在
可以看到,类中只有一个默认的
2. 编辑
现在说了半天数据并没有进入数据库啊!莫慌,就差最后一步了: 执行
执行完之后,就会发现数据已经填充到数据库了:
当然,使用模型工厂之前,必须要有个对应于
生成的
模型工厂对应于
在方法中,对应于每个必须的字段,填充上对应的值;
然后回到
这里调用factory方法,
执行完毕之后,就会发现数据表中新增了十条数据.
2.4 单次执行全部
上面的操作虽然可以完成对一张表批量插入多条数据,但是如果我有多个表都要进来批量插入数据,难道要执行多次
然后我们再执行
这个命令的作用就是执行
其实还有个最为强大的命令:
这个命令主要做了三件事:
执行所有的回滚,也就是
所有回滚执行完毕后,执行所有的迁移,也就是按照时间顺序执行所有的
执行所有的数据填充,也就是执行
定义路由在web.php中
alter table xxx add ..的方式直接修改,但是这么做有些弊端,比如在开发阶段,你自己的库表修改了,还要把这句
sql语句传给别人再执行一遍,这在多人协同开发时不是一种好的方式.那有没有一种方式能让我们对数据库 库表的修改做一些简单的版本控制,同时能让其他人很方便的同步我们对数据库的修改呢?
答案是我们可以使用
Laravel内置的
Migrations.
对数据库的管理包括哪些部分?
其实Laravel对数据库的版本管理主要包括两部门: 数据库结构的管理 和数据的管理.
数据库结构的管理: 主要是对数据库结构进行管理,比如新增了一张表,某张表增加了一个字段等等.
数据的管理: 这个主要是管理表中的数据,生成一些填充数据,解决我们开发调试时没有测试数据的问题.
数据库结构管理
要记录下我们对数据库结构所做的更改,我们可以使用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. 安装Laravel
的Migrations
如果我们是第一次使用Migrations,那就要先执行
migrate:install命令来支持数据库的迁移,进入到项目的根目录,执行安装命令:
php artisan migrate:install
这句话执行了以后,
Laravel会在数据库新建一张
migrations表,用这张表来记录我们每次对数据库做的更改:
4. 创建迁移文件
以上三步是我们在首次使用Migrations是需要做的,相当于初始化工作,以后每次的更改只需要做下面的工作,好,我们接着往下走.我们的目标是创建一张表,比如说就创建一张商品表
goods,首先我们用
artisan命令来创建一个对应的迁移文件:
php artisan make:migrationcreate_goods_table--create=goods
执行信息如下:
Created Migration: 2017_03_05_214805_create_goods_table
这句话解释一下,
make:migration是迁移命令,
create_goods_table是迁移文件的文件名,
--create=goods是该命令携带的参数,意思是创建一张表,并且表名是
goods,这句话执行完毕以后, 我们可以在database\migrations目录下看到多个一个文件:
5. 编辑迁移文件:
我们首先看一下这个文件的结构,<?php use 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'); } }
解释一下这个文件:
该文件包括两个函数,
up和
down,
up方法是当执行迁移动作时要执行的方法,
down方法是在进行数据库回滚的时候执行的方法,因此
up和
down是一对
反方法,
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 4000 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文件:
<?php use 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:
<?php namespace 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类,指定他们的执行顺序:
<?php use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Seeder; class DatabaseSeederextends 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
这个命令主要做了三件事:
执行所有的回滚,也就是
migrations目录下所有文件的
down方法,执行的时候按照时间顺序.
所有回滚执行完毕后,执行所有的迁移,也就是按照时间顺序执行所有的
up方法.
执行所有的数据填充,也就是执行
DatabaseSeeder中的
run方法.如果在
run方法中没有调用其他的
seeder,则这个
seeder的
run方法不会被执行.
定义路由在web.php中
相关文章推荐
- Laravel 5.2 数据库迁移和数据填充
- Laravel学习笔记(五)数据库 数据库迁移案例2——创建数据结构,数据表,修改数据结构
- laravel框架数据迁移、填充(简单示例)--学习笔记
- Laravel 5数据库 数据库迁移案例2——创建数据结构,数据表,修改数据结构
- [李景山php]每天laravel[034]-laravel 基础知识 --- 数据迁移及填充
- php Laravel框架学习(一) 之 建立数据库并填充测试数据
- Laravel实现数据库迁移与支持中文的填充
- Laravel中数据迁移与数据填充的详细步骤
- Laravel框架数据迁移和填充
- 大数据迁移实践之路
- Laravel4.1数据库 数据库迁移案例2——创建数据结构,数据表,修改数据结构(五)
- laravel 数据迁移与填充的应用总结
- Laravel数据库迁移和填充(支持中文)
- 推荐SQL Server 2005 2000 各版本数据库 数据迁移工具
- CYQ.Data 轻量数据层之路 框架如何应对数据库变化
- 数据量10亿级别的数据库表,多行存储成一行、一列扩展成多列之数据优化及迁移方案(二)
- 数据量10亿级别的数据库表,多行存储成一行、一列扩展成多列之数据优化及迁移方案(一)
- 把一个数据库中的一个表数据迁移到另一个数据库的相同结构的表中
- MySQL Innodb数据库性能实践——热点数据性能
- 如何将openCRX数据从HSQLDB迁移到其他数据库