胎嘎侯
前兩天筆者進行1對1及1對多還稱得上順利,沒想到多對多的小坑這麼多,走得有點崎嶇啊~
那就請各位踩(?)著我的經驗前行,包你少碰幾個坑嗚嗚
說明此次Many to Many實作的例子:User跟Video要與第3張資料表user_video相關聯,下圖為關係圖。一個user會有多個video的借閱紀錄,而且每個video都與多個用戶有關。
建表時有幾點要特別注意:
建表順序:Laravel的migration table 在新增時會連帶把檔案時間納入檔名,eg:2019_10_07_013145_create_posts_table
,因此在建表時,記得中間表(樞紐表)要最後建立哦,否則它無法辨別user和video表的關係,畢竟就像被插隊一樣,系統自然會報錯啦。
建表名稱:多對多關係利用一個樞紐表格來連接兩者,命名規範為將兩個表格名稱按照字母順序
,並在它們之間加上一個底線來分隔。
樞紐表的命名較特別,所以不適合使用php artisan make:mdoel Name -m
的方式建立,需要單獨進行migration的建表指令,為什麼呢?利用這個指令建立的表名會出現複數形式,這恰恰與我們要遵守的規範不同。
統整建表的指令為:
php artisan make:mdoel User -m //users table
php artisan make:mdoel Video -m //videos table
php artisan make:migration create_user_video_table //user_video table
videos 與 user_video要新增的欄位如下,users table無新增欄位就不放上來了
2019_10_08_093805_create_videos_table
public function up()
{
Schema::create('videos', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
2019_10_08_093858_create_user_video_table
public function up()
{
Schema::create('user_video', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('video_id');
$table->string('days');
$table->timestamps();
});
}
記得要到資料庫去確認是否成功建立欄位~
Many to Many 要呈現的內容比較多,好的建表會是成功的1/3,今天就先到這裡,明天見啦。
參考圖書:
Laravel 啟動與運行 (Laravel: Up and Running: A Framework for Building Modern PHP Apps)