Laravel - Database - Migrations

前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。



Generating Migrations

以下的 Laravel example command 的意思是?
  • Example:
    php artisan make:migration create_users_table --create=users

    php artisan make:migration add_votes_to_users_table --table=users
  • Answer:
    // 建立 migration, 並建立且對應 table users
    php artisan make:migration create_users_table --create=users

    // 建立 migration, 並指定對應 table 為 users
    php artisan make:migration add_votes_to_users_table --table=users

Squashing Migrations

以下的 Laravel example command 的意思是?
  • Example:
    php artisan schema:dump

    php artisan schema:dump --prune
  • Answer:
    // 將所有的 migrations file 輸出成一個 SQL file
    php artisan schema:dump

    // 將所有的 migrations file 輸出成一個 SQL file, 並刪除 migrations file
    php artisan schema:dump --prune


Migration Structure

以下的 Laravel Example code 的意思是?
  • Example:
    <?php

    class CreateFlightsTable extends Migration
    {

    public function up()
    {
    Schema::create('flights', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('airline');
    $table->timestamps();
    });
    }

    public function down()
    {
    Schema::drop('flights');
    }
    }
  • Answer:
    <?php

    class CreateFlightsTable extends Migration
    {

    // up() 內為 migration 主要執行的動作
    public function up()
    {
    Schema::create('flights', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('airline');
    $table->timestamps();
    });
    }

    // down() 內為與 up() 相反的執行動作
    public function down()
    {
    Schema::drop('flights');
    }


Running Migrations

Forcing Migrations To Run In Production

以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate --force
  • Answer:
    在 production 環境中, 要執行 migrate 會跳出確認視窗, 如果使用 –force 就可以跳過

Rolling Back Migrations

以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate:rollback
  • Answer:
    回滾上一個 batch 的 migrations, 也就是執行 migration class 中 down() 內的動作, 可能會有多個 migrations 檔案
以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate:rollback --step=5
  • Answer:
    預設 rollback 會回滾上一個 batch 的 migrations, –step flag 可以指定 migrations file 的數量
以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate:reset
  • Answer:
    回滾所有的 migrations

Roll Back & Migrate Using A Single Command

以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate:refresh

    // Refresh the database and run all database seeds...
    php artisan migrate:refresh --seed
  • Answer:
    // rollback 所有的 migrations, 並且再 migrate 他們
    php artisan migrate:refresh

    // rollback 所有的 migrations, 並且再 migrate 他們, 並執行 seed
    php artisan migrate:refresh --seed
以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate:refresh --step=5
  • Answer:
    預設會 rollback 並 migrate 所有的 migrations, –step flag 可以指定 migrations 數量

Drop All Tables & Migrate

以下的 Laravel example command 的意思是?
  • Example:
    php artisan migrate:fresh

    php artisan migrate:fresh --seed
  • Answer:
    // drop 所有的 table, 而並非執行 "down()" 內的動作, 然後再 migrate
    php artisan migrate:fresh
    // drop 所有的 table, 而並非執行 "down()" 內的動作, 然後再 migrate, 並執行 seed
    php artisan migrate:fresh --seed


Tables

Creating Tables

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    Schema::create('users', function (Blueprint $table) {
    $table->id();
    });
  • Answer:
    建立一個名為 users 的 table, column 為 id

Checking For Table / Column Existence

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    if (Schema::hasTable('users')) {
    //
    }

    if (Schema::hasColumn('users', 'email')) {
    //
    }
  • Answer:
    <?php
    // 判斷是否有 users 這個 table
    if (Schema::hasTable('users')) {
    //
    }

    // 判斷 users table 中是否有 email 這個 column
    if (Schema::hasColumn('users', 'email')) {
    //
    }

Database Connection & Table Options

以下的 Laravel Migration example command 的意思是?
  • Example:
    <?php
    Schema::connection('foo')->create('users', function (Blueprint $table) {
    $table->id();
    });
  • Answer:
    指定在 foo 這個 database 中建立 users table
以下的 Laravel Migration example command 的意思是?
  • Example:
    <?php
    $table->engine = 'InnoDB';
    $table->charset = 'utf8mb4';
    $table->collation = 'utf8mb4_unicode_ci';
    $table->temporary();
  • Answer:
    <?php
    // 指定 table 的 storage engine
    $table->engine = 'InnoDB';
    // 指定 character set
    $table->charset = 'utf8mb4';
    // 指定 collation
    $table->collation = 'utf8mb4_unicode_ci';
    // 建立臨時 table
    $table->temporary();

Renaming / Dropping Tables

以下的 Laravel Migration example command 的意思是?
  • Example:
    <?php
    Schema::rename($from, $to);
  • Answer:
    重命名 table
以下的 Laravel Migration example command 的意思是?
  • Example:
    <?php
    Schema::drop('users');

    Schema::dropIfExists('users');
  • Answer:
    <?php
    // drop users table
    Schema::drop('users');

    // 如果 users table 存在, drop it
    Schema::dropIfExists('users');


Columns

Modifying Columns

以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
    });
  • Answer:
    變更欄位為 ‘name’ 的 column type, 變更為 50 characters, 變且新增 nullable type
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
    });
  • Answer:
    變更 column 的名稱
Laravel 中, 支援 rename enum 欄位嗎?

不支援


Dropping Columns

以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
    });
  • Answer:
    drop 複數 column
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropMorphs('morphable');
  • Answer:
    drop morphable_id 以及 morphable_type column
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropSoftDeletes();
  • Answer:
    drop deleted_at column
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropTimestamps();
  • Answer:
    drop created_at 以及 updated_at column


Indexes

Creating Indexes

以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->string('email')->unique();
  • Answer:
    建立 ‘email’ column 並增加 unique type
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    public function boot()
    {
    Schema::defaultStringLength(191);
    }
  • Answer:
    指定 migration 產生的 default string length, 所以 MySQL 可以產生索引, 若 MySQL 版本 older than 5.7.7, 需手動指定, 否則可能會出現 "SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes" (SQL: alter table usersadd uniqueusers_email_unique(email)) exception

Renaming Indexes

以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->renameIndex('from', 'to')
  • Answer:
    重新命名 index

Dropping Indexes

以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropPrimary('users_id_primary');
  • Answer:
    去掉 primary key
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropUnique('users_email_unique');
  • Answer:
    去掉 unique key
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropIndex('geo_state_index');
  • Answer:
    去掉 index
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropSpatialIndex('geo_location_spatialindex');
  • Answer:
    去掉 spatial index
以下的 Laravel Migration example code 中, 被 drop 的 index name 是什麼?
  • Example:
    <?php
    Schema::table('geo', function (Blueprint $table) {
    $table->dropIndex(['state']); // Drops index 'geo_state_index'
    });
  • Answer:
    geo_state_index

Foreign Key Constraints

以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
    });
  • Answer:
    定義一個 foreign key user_id, reference users table 的 id column, 如果該 users table 的 id 不存在, 那該筆資料就無法被建立
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
    });
  • Answer:
    foreignId 為 unsignedBigInteger 的 alias, constrained 會自動 reference users table 的 id column, 如果 reference 的 table 不是 users, 那可以在 constrained method 中帶入 argument
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->foreignId('user_id')
    ->constrained()
    ->onDelete('cascade');
  • Answer:
    當該 user 被 delete 時, 會連帶 delete 有 reference 的 foreign key column
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropForeign('posts_user_id_foreign');
  • Answer:
    從 posts table 中的 user_id column, drop foreign key index
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    $table->dropForeign(['user_id']);
  • Answer:
    將 column name 包在 array 中, Laravel 會依照 constraint name convention 去尋找並 drop foreign key index
以下的 Laravel Migration example code 的意思是?
  • Example:
    <?php
    Schema::enableForeignKeyConstraints();

    Schema::disableForeignKeyConstraints();
  • Answer:
    啟用或關閉 foreignKeyConstraints 功能, 有些資料庫默認是關閉的, 如 SQLite, 若要使用須先打開才行

# Additional

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function up()
    {
    Schema::table('orders', function (Blueprint $table) {
    $table->unsignedBigInteger('coupon_code_id')->nullable()->after('paid_at');
    $table->foreign('coupon_code_id')->references('id')->on('coupon_codes')->onDelete('set null');
    });
    }
  • Answer:
    當 coupon 被刪除, 就將 orders table 中的 coupon_code_id 設為 null
Laravel - Database - Seeding Laravel - Database - Pagination (官方文件原子化翻譯)

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×