Laravel 实践之路: 数据库迁移与数据填充

什么是数据库的迁移?

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

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

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

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

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

数据库结构管理

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

下面咱们就走个小例子,看看若是要在数据库中新增一个库表具体该怎么作:数据库

1. 建立一个数据库

Laravel要和咱们的数据库链接,首先要有个对应的数据库,你能够在PHPMyAdmin或者navicat for mysql 等管理工具新建一张表:闭包

CREATE DATABASE `laravel5`;

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

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

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表,用这张表来记录咱们每次对数据库作的更改:工具

clipboard.png

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目录下看到多个一个文件:

clipboard.png

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');
    }
}

解释一下这个文件:

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

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

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

$table->increments('id');
建立一个自增加的字段,字段名默认叫id,固然你也能够改为其余名字.

$table->timestamps();
这里会在表中建立created_atupdated_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

输出结果为:

clipboard.png

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

clipboard.png

同理,若是你想在这个表中新增一个字段,能够从第四步到第六步再走一遍,只不过此次再也不是建立表,可是流程是同样的.

7. 数据库回滚:

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

php artisan migrate:rollback

注意,这个命令并非回滚全部的migrate操做,而是回滚你上一次的操做,若是你想执行全部的回滚,可使用reset命令,执行后会按照迁移文件的时间排序执行全部文件的down方法;

php artisan migrate:reset

8. 重建整个数据库

使用refresh命令,能够回滚全部的操做,而后再次执行全部的迁移,实际就是按照时间排序执行全部的down方法,而后再执行全部的up方法;

php artisan migrate:refresh

clipboard.png


数据填充

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

执行完以后,就会发现数据已经填充到数据库了:
clipboard.png

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

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

php artisan make:model Models\Good

生成的ModelGood:

<?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 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方法不会被执行.

相关文章
相关标签/搜索