上回我們大致上講了如何使用migration,這回我想簡單介紹我的簡易trello專案的table,順便講講怎麼用migration建立關聯式資料表吧!
下圖是我簡易trello專案中的資料表結構
先講講我的需求吧
依照上面3個需求,可以輕易的看出我資料表設計時,該有怎麼樣的關聯。
而圖中的groups是我多對多關連中獨立出來的table。多對多的關聯可以向這樣,新增一個新的table他分別跟users以及card為一對多的關係。
你可以理解為多對多就是兩個一對多的意思。
以下是groups這張表的migration
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Group extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('groups', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('users_id');
$table->foreign('users_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->unsignedBigInteger('card_id');
$table->foreign('card_id')->references('id')->on('card')->onDelete('cascade')->onUpdate('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
想要建立一對多的關係,你必須有個外鍵(foreign key) 關聯到其他table。
簡單講就是一對多的多的這張table新增一個column當作外鍵,也就是向這樣寫:
$table->unsignedBigInteger('users_id');
然後設定他為外鍵(foreign key)
$table->foreign('users_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
上面的code是將users_id關聯到users這張table的id這個column。
onDelete('cascade')
、onUpdate('cascade')
這兩個參數是為了在刪除或新增users內的資料,可以自動更改groups的資料。
上面的例子,當你要刪除users內的資料,若是不加上onDelete('cascade')
這個參數,會因為有groups關聯著,SQL會報錯誤,而無法刪除。
migration就講到這裡,其他比較進階的用法,可以參考官網。
參考:https://laravel.com/docs/7.x/migrations