• 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
    
  • 相关阅读:
    No module named '_sqlite3'
    去西交大考PAT认证
    PAT——乙级1006:换个格式输出整数&乙级1021:个位数统计&乙级1031:查验身份证
    Python——数据类型之set
    python——pyinstaller生成exe基本使用和遇到的坑
    PAT——乙级1022:D进制的A+B &乙级1037:在霍格沃茨找零钱
    PAT——乙级1036:跟奥巴马一起编程 &乙级1027:打印沙漏 (有坑)
    Python——数据类型之dict
    为DEV C++/CodeBlock配置gdb调试遇到的问题
    PAT——甲级1012:The Best Rank(有坑)
  • 原文地址:https://www.cnblogs.com/makalochen/p/14399208.html
Copyright © 2020-2023  润新知