今天要來介紹migration,那這到底是甚麼呢?migration其實是紀錄表格的建立時間,碩以前沒有寫過的可能會覺得這個有些麻煩,為甚麼不打開資料庫直接建就好,還要特地寫一個檔案來記錄呢?那是因為migration紀錄的不只是資料庫所需的,他同時還記錄著建立的時間,它的好處是可以做版本控制,能夠回到特定時間的狀態,這對開發大型的專案有很大的幫助。
若是你之後想要自己建migration,你需要的指令為:php artisan make:migration
你需要的名字,那名字推薦使用 make_名字_table,你也可以在後面接上 --create="名字",那麼他也會給你一個有基本資料的migration,例如:php artisan make:migration make_prefer_table --create="prefer"
,不建議名字亂取,這樣可能會在存取資料的時候出現問題。那不加create也是沒有問題的,你依舊可以正常的取得migration。
今天寫的資料和明天要介紹的東西有相關聯,可以兩天一起看完之後再回來建可能會比較清楚喔!
在開始寫之前讓我們先到database\migrations的資料夾看看昨天跟著model建的migration是甚麼樣子吧。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('articles');
}
};
我們可以看到這個檔案大致分成兩個部分,第一個部分為up funtion第二部分為down,其實up就是在建立表格,他目前有著兩個attribute:
而down做的是很單純,就是將整個table drop。
那在建立migration之前我們建議先去做規劃,越詳細越小心越好。為甚麼呢?因為我們在建立完之後只要migrate(紀錄)後,再去改裡面的值就無法讀到了,因為他記錄著這個table的生成時間,你之後改的任何資料他依舊會停留在那個時間的狀態,那難道我之後發現缺少了甚麼需要的屬性我就诶有辦法加上去了嗎?
當然還是有辦法,你可以將上面建立migration時的名字改成add_table_to_名字,laravel很聰明的可以自動幫你找到你想要擴充的table,雖然不是每一次都能成功但是若是出錯了自己再改回來也不會很困難。
這麼做好像就解決了migration資料的問題,但這其實藏著一個弊端,就是你的檔案資料夾會越來越肥大,導致之後在做閱讀或是管理時會較難去整理。
那大家可以先做規劃,我們當初是邊做討論邊去寫下我們所需的物件,可以先將需要的物件寫下來並在後面標註要存的資料型別,這樣之後再建的時候會比較清楚喔,例如:
那規劃完我們就可以開始建立了。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->text('summary');
$table->date('start_time');
$table->date('end_time');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('articles');
}
};
我們除了一些文章基本的需求:標題、內文、總結,我們還增加了可以開始報名的時間以及結束報名的時間,這是為了在約28天的時候我們要實作時間判斷,那這樣看下來我們還多加了一行$table->softDeletes();
那這是甚麼?
這個是為了保護重要的資料不會輕易地消失,在其他不需要多加保存的資料,若是你刪除了就會直接從資料庫中移出這一筆資料,但是我們加了之後他就會多一個物件叫做:delete at,並在你按下刪除後會建立你刪除的時間,並不會真正的幫你做刪除資料的動作,這個可以讓你未來在不小心刪除重要資料後能夠從資料庫中將它恢復。
那我們今天基本article的table就建好了,明天我們充當一次牽線人,為別人建立關係,但別把自己繞進去了只怕那會像沼澤一樣拖你下去的,那我們明天見,掰掰。