Laravel 数据库的迁移和填充

Laravel 数据库的迁移和填充

数据库迁移是什么?

使用php文件编写的代码来进行数据库表结构的创建和修改。

生成与编写迁移

php artisan make:migration create_test_table --create=test

# create_test_table  生成的文件后缀名称
# --create=test    生成表名为test的数据表

生成如下

image-20210210202916195

编写迁移文件,创建字段和表

可用的字段类型

方法 对应的字段类型
$table->bigIncrements('id'); 递增 ID(主键),相当于「UNSIGNED BIG INTEGER」型态。
$table->bigInteger('votes'); 相当于 BIGINT 型态。
$table->binary('data'); 相当于 BLOB 型态。
$table->boolean('confirmed'); 相当于 BOOLEAN 型态。
$table->char('name', 4); 相当于 CHAR 型态,并带有长度。
$table->date('created_at'); 相当于 DATE 型态
$table->dateTime('created_at'); 相当于 DATETIME 型态。
$table->dateTimeTz('created_at'); DATETIME (带时区) 形态
$table->decimal('amount', 5, 2); 相当于 DECIMAL 型态,并带有精度与基数。
$table->double('column', 15, 8); 相当于 DOUBLE 型态,总共有 15 位数,在小数点后面有 8 位数。
$table->enum('choices', ['foo', 'bar']); 相当于 ENUM 型态。
$table->float('amount', 8, 2); 相当于 FLOAT 型态,总共有 8 位数,在小数点后面有 2 位数。
$table->increments('id'); 递增的 ID (主键),使用相当于「UNSIGNED INTEGER」的型态。
$table->integer('votes'); 相当于 INTEGER 型态。
$table->ipAddress('visitor'); 相当于 IP 地址形态。
$table->json('options'); 相当于 JSON 型态。
$table->jsonb('options'); 相当于 JSONB 型态。
$table->longText('description'); 相当于 LONGTEXT 型态。
$table->macAddress('device'); 相当于 MAC 地址形态。
$table->mediumIncrements('id'); 递增 ID (主键) ,相当于「UNSIGNED MEDIUM INTEGER」型态。
$table->mediumInteger('numbers'); 相当于 MEDIUMINT 型态。
$table->mediumText('description'); 相当于 MEDIUMTEXT 型态。
$table->morphs('taggable'); 加入整数 taggable_id 与字符串 taggable_type
$table->nullableMorphs('taggable'); morphs() 字段相同,但允许为NULL。
$table->nullableTimestamps(); timestamps() 相同,但允许为 NULL。
$table->rememberToken(); 加入 remember_token 并使用 VARCHAR(100) NULL。
$table->smallIncrements('id'); 递增 ID (主键) ,相当于「UNSIGNED SMALL INTEGER」型态。
$table->smallInteger('votes'); 相当于 SMALLINT 型态。
$table->softDeletes(); 加入 deleted_at 字段用于软删除操作。
$table->string('email'); 相当于 VARCHAR 型态。
$table->string('name', 100); 相当于 VARCHAR 型态,并带有长度。
$table->text('description'); 相当于 TEXT 型态。
$table->time('sunrise'); 相当于 TIME 型态。
$table->timeTz('sunrise'); 相当于 TIME (带时区) 形态。
$table->tinyInteger('numbers'); 相当于 TINYINT 型态。
$table->timestamp('added_on'); 相当于 TIMESTAMP 型态。
$table->timestampTz('added_on'); 相当于 TIMESTAMP (带时区) 形态。
$table->timestamps(); 加入 created_atupdated_at 字段。
$table->timestampsTz(); 加入 created_at and updated_at (带时区) 字段,并允许为NULL。
$table->unsignedBigInteger('votes'); 相当于 Unsigned BIGINT 型态。
$table->unsignedInteger('votes'); 相当于 Unsigned INT 型态。
$table->unsignedMediumInteger('votes'); 相当于 Unsigned MEDIUMINT 型态。
$table->unsignedSmallInteger('votes'); 相当于 Unsigned SMALLINT 型态。
$table->unsignedTinyInteger('votes'); 相当于 Unsigned TINYINT 型态。
$table->uuid('id'); 相当于 UUID 型态。

字段修饰

Modifier Description
->after('column') 将此字段放置在其它字段「之后」(仅限 MySQL)
->comment('my comment') 增加注释
->default($value) 为此字段指定「默认」值
->first() 将此字段放置在数据表的「首位」(仅限 MySQL)
->nullable() 此字段允许写入 NULL 值
->storedAs($expression) 创建一个存储的生成字段 (仅限 MySQL)
->unsigned() 设置 integer 字段为 UNSIGNED
->virtualAs($expression) 创建一个虚拟的生成字段 (仅限 MySQL)

例:创建一个文章表

<?php
/**
 * 文章表
 */
use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateArticleTable extends Migration
{
    /**
     * 创建时我们用的方法
     * @return void
     */
    public function up()
    {
        Schema::create('article', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('uid')->default(0)->comment('用户ID');
            $table->string('title',200)->default('')->comment('标题');
            $table->string('desn',500)->default('')->comment('描述');
            $table->text('cnt')->comment('文章内容');
            $table->timestamps();
        });

        /*Schema::create('cate', function (Blueprint $table) {
            $table->increments('id');
            $table->string('cname',200)->default('')->comment('分类名称');
            $table->timestamps();
        });*/
    }
    /**
     * 回滚时用到的方法
     * @return void
     */
    public function down()
    {
        // 如果表存在则删除此表
        Schema::dropIfExists('article');
        #Schema::dropIfExists('cate');
    }
}

image-20210210224438304

执行数据迁移

php artisan migrate

# 直接执行迁移文件中的up方法

image-20210212162523059

回滚迁移

回滚最后一次的迁移操作, 删除(回滚)之后会删除迁移记录,并且数据表也会删除,但是迁移文件依旧存在,方便后期继续迁移(创建数据表)

php artisan migrate:rollback

# 直接执行迁移文件中的 down方法

img

回滚条件,根据数据表中的

img

根据此值来找迁移文件,然后执行迁移文件中的down方法

清除表后再执行迁移

php artisan  migrate:refresh

# 先执行所有的迁移文件的down方法,再执行所有的迁移文件的up方法

img

小结

# 创建
php artisan make:migration 文件名  --create=表名

#编写迁移文件 [见文档]

#执行
php artisan migrate

#回滚
php artisan migrate:rollback

#清除表并重新执行迁移
php artisan migrate:refresh

数据填充

填充操作就是往数据表中写测试数据的操作。

创建种子文件

php artisan make:seeder TestTableSeeder{种子文件的名/文件名}

例:

php artisan make:seeder ArticleSedder

image-20210212172005585

编写种子文件

在创建的文件的run 方法中写入

<?php

use IlluminateDatabaseSeeder;

class ArticleSedder extends Seeder
{
    /**
     * 要入库的操作
     *
     * @return void
     */
    public function run()
    {
        $data = [];
        for($i = 1; $i <= 10 ; $i++){
            $data[] = [
                'uid' =>  $i,
                'title' =>  '标题'.$i,
                'desn' =>  '描述'.$i,
                'cnt' =>  '内容'.$i
            ];
        }
        //添加数据
        DB::table('article')->insert($data);
    }
}

image-20210212194242937

执行种子文件

# 执行指定种子的文件
php artisan db:seed --class=需要执行的种子文件名


# 执行全部的种子文件
php artisan db:seed  必须在DatabaseSeeder文件中定义好 call
 

# 删除表并执行迁移和种子文件
php artisan migrate:refresh --seed 必须在DatabaseSeeder文件中定义好 call

执行指定种子的文件

php artisan db:seed --class=ArticleSedder

# ArticleSedder为种子文件名

执行全部的种子文件

使用db:seed 执行不带参数

DatabaseSeeder文件中run中的使用call方法中调用我们的写的种子

<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * 调用我们编写好的种子文件
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
        //顺序从上往下
        //调用ArticleSedder种子文件
        $this->call(ArticleSedder::class);
    }
}

image-20210212195322410

执行种子

# 必须在DatabaseSeeder文件中定义好 call
php artisan db:seed

删除表并执行迁移和种子文件

# 必须在DatabaseSeeder文件中定义好 call
php artisan migrate:refresh --seed 

如果找不到类,更新下映射关系文件

composer dump
原文地址:https://www.cnblogs.com/makalochen/p/14399208.html