laravel資料庫遷移

huaweichenai發表於2023-02-14

一:建立遷移

在laravel中使用make:migration命令來建立遷移

php artisan make:migration create_user_table

執行上面的命令後這時候會在database/migrations 目錄下生成對應的遷移檔案,每個遷移的檔名都包含一個時間戳來讓 Laravel 確認遷移的順序

二:遷移結構

一個遷移類包含兩個方法: up 和 down。up 方法是用於新增資料庫的資料表、欄位或者索引的,而 down 方法應該與 up 方法的執行操作相反。

1:up方法

public function up()
{
    Schema::create('user', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

2:down方法

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

三:執行遷移

php artisan migrate

大多數遷移操作都是破壞性的,這意味著也許會丟失資料。為了防止有人在生產環境資料中執行這些命令,在執行這些命令之前將提示你進行確認。如果要強制遷移命令在沒有提示的情況下執行,請使用 --force 引數

php artisan migrate --force

四:遷移回滾

php artisan migrate:rollback

透過向 rollback 命令加上 step 引數,可以回滾指定數量的遷移

php artisan migrate:rollback --step=5

migrate:reset 命令將會滾回你應用程式所有的遷移:

php artisan migrate:reset

五:回滾後遷移

migrate:refresh 命令將會在回滾你所有的遷移後執行 migrate 命令。這個命令可以高效的重新建立你的整個資料庫:

php artisan migrate:refresh

// 重新整理資料庫並執行資料庫填充
php artisan migrate:refresh --seed

六:可用欄位型別

在laravel的資料庫遷移中,支援的欄位型別有:

命令描述
$table->bigIncrements('id');遞增 ID(主鍵),相當於「UNSIGNED BIG INTEGER」
$table->bigInteger('votes');相當於 BIGINT
$table->binary('data');相當於 BLOB
$table->boolean('confirmed');相當於 BOOLEAN
$table->char('name', 100);相當於帶有長度的 CHAR
$table->date('created_at');相當於 DATE
$table->dateTime('created_at');相當於 DATETIME
$table->dateTimeTz('created_at');相當於帶時區 DATETIME
$table->decimal('amount', 8, 2);相當於帶有精度與基數 DECIMAL
$table->double('amount', 8, 2);相當於帶有精度與基數 DOUBLE
$table->enum('level', ['easy', 'hard']);相當於 ENUM
$table->float('amount', 8, 2);相當於帶有精度與基數 FLOAT
$table->geometry('positions');相當於 GEOMETRY
$table->geometryCollection('positions');相當於 GEOMETRYCOLLECTION
$table->increments('id');遞增的 ID (主鍵),相當於「UNSIGNED INTEGER」
$table->integer('votes');相當於 INTEGER
$table->ipAddress('visitor');相當於 IP 地址
$table->json('options');相當於 JSON
$table->jsonb('options');相當於 JSONB
$table->lineString('positions');相當於 LINESTRING
$table->longText('description');相當於 LONGTEXT
$table->macAddress('device');相當於 MAC 地址
$table->mediumIncrements('id');遞增 ID (主鍵) ,相當於「UNSIGNED MEDIUM INTEGER」
$table->mediumInteger('votes');相當於 MEDIUMINT
$table->mediumText('description');相當於 MEDIUMTEXT
$table->morphs('taggable');相當於加入遞增的 taggable_id 與字串 taggable_type
$table->uuidMorphs('taggable');相當於加入 taggable_id 與字串 taggable_typeUUID 列。
$table->multiLineString('positions');相當於 MULTILINESTRING
$table->multiPoint('positions');相當於 MULTIPOINT
$table->multiPolygon('positions');相當於 MULTIPOLYGON
$table->nullableMorphs('taggable');相當於可空版本的 morphs () 欄位
$table->nullableUuidMorphs('taggable');相當於可空版本的 uuidMorphs() 欄位
$table->nullableTimestamps();相當於可空版本的 timestamps() 欄位
$table->point('position');相當於 POINT
$table->polygon('positions');相當於 POLYGON
$table->rememberToken();相當於可空版本的 VARCHAR (100) 的 remember_token 欄位
$table->set('flavors', ['strawberry', 'vanilla']);相當於 SET
$table->smallIncrements('id');遞增 ID(主鍵),相當於「UNSIGNED SMALLINT」
$table->smallInteger('votes');相當於 SMALLINT
$table->softDeletes();相當於為軟刪除新增一個可空的 deleted_at 欄位
$table->softDeletesTz();相當於為軟刪除新增一個可空的 帶時區的 deleted_at 欄位
$table->string('name', 100);相當於帶長度的 VARCHAR
$table->text('description');相當於 TEXT
$table->time('sunrise');相當於 TIME
$table->timeTz('sunrise');相當於帶時區的 TIME
$table->timestamp('added_on');相當於 TIMESTAMP
$table->timestampTz('added_on');相當於帶時區的 TIMESTAMP
$table->timestamps();相當於可空的 created_at 和 updated_at TIMESTAMP
$table->timestampsTz();相當於可空且帶時區的 created_at 和 updated_at TIMESTAMP
$table->tinyIncrements('id');相當於自動遞增 UNSIGNED TINYINT
$table->tinyInteger('votes');相當於 TINYINT
$table->unsignedBigInteger('votes');相當於 Unsigned BIGINT
$table->unsignedDecimal('amount', 8, 2);相當於帶有精度和基數的 UNSIGNED DECIMAL
$table->unsignedInteger('votes');相當於 Unsigned INT
$table->unsignedMediumInteger('votes');相當於 Unsigned MEDIUMINT
$table->unsignedSmallInteger('votes');相當於 Unsigned SMALLINT
$table->unsignedTinyInteger('votes');相當於 Unsigned TINYINT
$table->uuid('id');相當於 UUID
$table->year('birth_year');相當於 YEAR

七:欄位修飾

在laravel的資料庫遷移中,支援的欄位修飾符有:

命令描述
->after('column')將此欄位放置在其它欄位 "之後" (MySQL)
->autoIncrement()將 INTEGER 型別的欄位設定為自動遞增的主鍵
->charset('utf8')指定一個字符集 (MySQL)
->collation('utf8_unicode_ci')指定列的排序規則 (MySQL/SQL Server)
->comment('my comment')為欄位增加註釋 (MySQL)
->default($value)為欄位指定 "預設" 值
->first()將此欄位放置在資料表的 "首位" (MySQL)
->nullable($value = true)此欄位允許寫入 NULL 值(預設情況下)
->storedAs($expression)建立一個儲存生成的欄位 (MySQL)
->unsigned()設定 INTEGER 型別的欄位為 UNSIGNED (MySQL)
->useCurrent()將 TIMESTAMP 型別的欄位設定為使用 CURRENT_TIMESTAMP 作為預設值
->virtualAs($expression)建立一個虛擬生成的欄位 (MySQL)
->generatedAs($expression)使用指定的序列生成標識列(PostgreSQL)
->always()定義序列值優先於標識列的輸入 (PostgreSQL)
->primary('id')新增主鍵
->primary(['id', 'parent_id'])新增複合鍵
->unique('email')新增唯一索引
->index('state')新增普通索引
->spatialIndex('location')新增空間索引(不支援 SQLite)
->renameIndex('from', 'to')重新命名索引
->dropPrimary('users_id_primary')刪除主鍵
->dropUnique('users_email_unique');刪除唯一索引
->dropIndex('geo_state_index');刪除基本索引
->dropSpatialIndex('geo_location_spatialindex');刪除空間索引(不支援 SQLite)

例項:

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});

八:修改欄位

change 方法可以將現有的欄位型別修改為新的型別或修改屬性,例:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

renameColumn方法來重新命名欄位,依賴於doctrine/dbal擴充,例:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

九:刪除欄位

dropColumn 方法來刪除欄位,例:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);//刪除votes,avatar,location欄位
});

十:索引長度 & Mysql / MariaDB

Laravel 預設使用 utf8mb4 編碼,它支援在資料庫中儲存 emojis 。如果你是在版本低於 5.7.7 的 MySQL 或者版本低於 10.2.2 的 MariaDB 上建立索引,那你就需要手動配置資料庫遷移的預設字串長度。即在 app/Providers/AppServiceProvider 中呼叫 Schema::defaultStringLength 方法來配置它

use Illuminate\Support\Facades\Schema;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

十一:外來鍵約束

Laravel 還支援建立用於在資料庫層中的強制引用完整性的外來鍵約束。例如,讓我們在 posts 表上定義一個引用 users 表的 id 欄位的 user_id 欄位:

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

在遷移檔案中使用以下方法來開啟或關閉外來鍵約束

Schema::enableForeignKeyConstraints();

Schema::disableForeignKeyConstraints();

相關文章