Laravel 技术笔记 (三)【Migrations 迁移】

介绍

迁移就像是资料库的版本控制器,并且让你可以轻松地去定义资料库的结构,包含新增资料表、修改栏位、创建索引...等等都可以透过程序码来定义,并且当进行团队协作时,你可以透过迁移很快的分享你对资料库的改动或结构给你的夥伴。


新增迁移

迁移是一系列的档案,放在 database/migrations 目录下,你可以使用 artisan 提供的指令来新增迁移,新增时你可以选填两个参数,--create={table_name} 会在新增迁移档案时预先撰写好新增「table_name」资料表的程序码,而 --table={table_name} 则会预先撰写好已经存在的「table_name」资料表的程序码:

$ php artisan make:migration create_books_table --create=books
/* 新增资料表 */
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('books');
    }
};
$ php artisan make:migration create_books_table --table=books
/* 已经存在的资料表 */
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::table('books', function (Blueprint $table) {
            //
        });
    }

    public function down()
    {
        Schema::table('books', function (Blueprint $table) {
            //
        });
    }
};


定义迁移

当我们新增一个 Laravel 专案时,会发现在目录下已经有几个迁移档案存在,我们先看看 2014_10_12_000000_create_users_table.php 这个档案的内容:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
};

档案中有两个已经定义好的方法 up 和 down,这两个方法都是告诉应用程序具体要对资料库做甚麽样的修改,差别在於 up 是去「执行」修改,down 是「撤销」修改,上图中 up 方法里的 Schema::create() 意思是新增一张名为 users 的资料表,并且透过 $table-> 语法给予资料表栏位与指定资料的型态,至於 down 方法里的 dropIfExists() 则是检查资料库是否有 users 这个资料表,如果存在就把资料表删除。
※关於如何透过迁移操作栏位(新增栏位、修改栏位、创建索引、添加外键...等等),由於语法众多,详情请见 Laravel 官方网站


执行迁移

定义好迁移後执行以下 artisan 指令(.env 档案内关於资料库的设定务必先设定完毕否则会报错),Laravel 便会按照档案名称的时间先後检查所有迁移档案是否被执行,并将那些还没执行过的全部执行:

$ php artisan migrate

另外指令也支援许多额外选项供操作:

/* 恢复到执行全部迁移之前的初使状态 */
$ php artisan migrate:reset
/* 恢复到执行全部迁移档案之前的初使状态,再执行每一个迁移 */
$ php artisan migrate:refresh
/* 删除所有资料表(不执行 down 而是直接删除资料表),再执行每一个迁移 */
$ php artisan migrate:fresh
/* 只恢复到你上一次执行迁移的状态,可添加参数 --step={n},指定恢复的数量 */
$ php artisan migrate:rollback --step=1
/* 显示一个列出所有迁移的表格,旁边会显示 Yes 或 No 表示是否已经执行过,显示的数字则代表是第几次执行指令时执行这个迁移档案 */
$ php artisan migrate:status

<<:  【学习笔记】CSS中的HTML Tag Box设定

>>:  1. STM32-STM32CubeIDE 安装/程序码补齐功能

【Day 06】C 的资料型态(下)

今天,我们来介绍一下常见的基本型别吧~ 基本型别 - 整数型别 - int int 型态是有正负号的...

[NestJS 带你飞!] DAY13 - Guard

什麽是 Guard? Guard 是一种检测机制,就像公司的保全系统,需要使用门禁卡才能进入,否则就...

[Day-30] 最後一天的小练习

首先要庆祝一下~ 终於撑到30天了 今天要来练习的是利用switch 来做一个选择的模式 模式有三种...

【JavaScript】用debugger进行除错

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...

介绍Vertex(4) | ML#Day21

继训练好模型之後,这篇介绍「部署」和「预测」的使用。 Vertex提供非常无脑的一键部署方式,不需要...