前言
學習一個框架, 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:
dropmorphable_id
以及morphable_type
column
以下的 Laravel Migration example code 的意思是?
- Example:
<?php
$table->dropSoftDeletes(); - Answer:
dropdeleted_at
column
以下的 Laravel Migration example code 的意思是?
- Example:
<?php
$table->dropTimestamps(); - Answer:
dropcreated_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 unique
users_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 keyuser_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
留言