Laravel 数据库迁移详解

文章目录

  • 创建表
    • 开始
    • 常见列名类型对照
    • 一些列名约束条件的写法
    • 在数据库中生成表
  • 填充测试数据(重点)
    • 方法一
    • 方法二
      • 模型工厂
      • 使用帮助函数factory

在以前我们进行数据库数据测试的时候一般是手动的添加数据,比如在数据库查询器中使用sql语句进行数据插入。如果数据较少,那还是蛮轻松的,但是如果数据过大,那就很蛋疼了,即使你将sql语句复制下来。但是这一切,在laravel中都变的非常轻松。

本文实例针对laravel最新的5.3版本进行测试,如若在其它版本出现问题,请在评论区留言。

创建表

对于喜欢命令行的朋友来说,laravel的artisan命令简直不能太方便了。

关于artisan的信息,大家可以参考:

  • 英文文档:https://laravel.com/docs/5.3/artisan

  • 中文文档:https://laravel-china.org/docs/5.3/artisan

开始

命令:php artisan make:migration create_users_table

意思:创建一张名为users的表。

接着你便能在database/migrations这个目录下找到与2014_10_12_000000_create_users_table.php这个类似的文件。

和以前用php语句创建表一样,我们可以在2014_10_12_000000_create_users_table.php这个文件中写上我们要创建表的字段及约束条件。

increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

一个migration类包含两个方法updown

  • up中主要包含创建表的具体内容。

  • down中和前者相反。

  • Schema::create接受两个参数。第一个是你要创建表的表名;第二个是一个闭包(匿名函数),获取用于定义新表的 Blueprint 对象。

更多有关Migration的介绍可以参考:https://laravel.com/docs/5.3/migrations#migration-structure

常见列名类型对照

命令 描述
$table->increments('id'); 数据库主键自增 ID
$table->integer('votes'); 等同于数据库中的 INTEGER 类型
$table->float('amount'); 等同于数据库中的 FLOAT 类型
$table->char('name', 4); 等同于数据库中的 CHAR 类型
$table->string('name', 100); 等同于数据库中的 VARCHAR
$table->dateTime('created_at'); 等同于数据库中的 DATETIME 类型
$table->enum('choices', ['foo','bar']); 等同于数据库中的 ENUM 类型
$table->tinyInteger('numbers'); 等同于数据库中的 TINYINT 类型
$table->timestamps(); 添加 created_at 和 updated_at 列

更多有关列名类型对照的介绍可以参考:https://laravel.com/docs/5.3/migrations#creating-columns

一些列名约束条件的写法

Schema::table('users', function ($table) {
    $table->integer('votes')->unsigned();    //无符号类型
});
修改器 描述
->first() 将该列置为表中第一个列 (仅适用于 MySQL)
->after('column') 将该列置于另一个列之后 (仅适用于 MySQL)
->nullable() 允许该列的值为 NULL
->default($value) 指定列的默认值
->unsigned() 设置integer 列为 UNSIGNED

在数据库中生成表

  • 生成命令:php artisan migrate

  • 回滚命令:php artisan migrate:rollback

填充测试数据(重点)

方法一

让我们修改 Laravel 安装时自带的 DatabaseSeeder 类,添加一个数据库插入语句到 run 方法:

database/seeders目录下我们可以找到DatabaseSeeder.php这个文件

insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

接着执行命令:php artisan db:seed

现在你可以去数据库中查看,会发现新增了一条数据

这里有一个问题,如果我们后期的表多了,那么这样单个填充器类就不会变得无比巨大。在laravel中提供了一个解决方案, 我们可以创建额外的填充器来专门针对一张表。

命令:php artisan make:seeder UserTableSeeder

意思:创建一张名为users的种子类或者理解为填充测试的类。UserTableSeeder这个名字可以任意取,但是要好分辨。所有框架生成的填充器都位于database/seeders目录。

insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

在 DatabaseSeeder 类中,你可以使用 call 方法执行额外的填充类,使用 call 方法允许你将数据库填充分解成多个文件。

call(UsersTableSeeder::class);
    }
}

与前面步骤一样,接着执行命令:php artisan db:seed

现在你可以去数据库中查看,会发现新增了一条数据

方法二

方法一和我们以前用sql语句插入一条数据是一样的效果,所以并没有多大的提升。我们想追求的是一次性填充多条测试数据,那么我们可以使用方法二。

手动指定每一个模型填充的属性是很笨重累赘的,在laravel中取而代之的,我们可以使用模型工厂来方便的生成大量的数据库记录。

首先,查看模型工厂文档来学习如何定义工厂,定义工厂后,可以使用帮助函数 factory 来插入记录到数据库。

模型工厂

作为开始,我们看一下 database/factories/ModelFactory.php 文件,该文件包含了一个工厂定义:

define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];

});

在闭包中,作为工厂定义,我们返回该模型上所有属性默认测试值。该闭包接收PHP库Faker实例,从而允许你方便地为测试生成多种类型的随机数据。

这里要注意Faker实例,可以参考https://github.com/fzaninotto/Faker

这个Faker实例提供了很多可用的随机数据,比如我们要填充人名,使用$faker->name即可,它最后会生成如Prof. King Feil这样的数据。这无疑是非常方便的,可以高度模拟。

更多有关模型工厂的介绍可以参考:

  • 英文文档:https://laravel.com/docs/5.3/database-testing#model-factories

  • 中文文档:https://laravel-china.org/docs/5.3/database-testing#model-factories

使用帮助函数factory

create(['password' => bcrypt('123456')]);
    }
}

其中factory接受两个参数:一个是Eloquent模型;另一个是插入数据数量。上面run方法中的语句表示创建50个模型,并将其存到数据库中。

接着让我们回到DatabaseSeeder.php调用call方法用于生成测试数据。

执行命令:php artisan db:seed

现在你可以去数据库中查看,会发现新增了50条数据。

你可能感兴趣的:(Web后端)