iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 23
1
Software Development

後端PHP+Laravel--新手實戰日記系列 第 23

Day23-Laravel新手基礎訓-Eloquent: Many to Many (前言:創建多對多資料表,踩坑大全)

胎嘎侯

前兩天筆者進行1對1及1對多還稱得上順利,沒想到多對多的小坑這麼多,走得有點崎嶇啊~
那就請各位踩(?)著我的經驗前行,包你少碰幾個坑嗚嗚

說明此次Many to Many實作的例子:User跟Video要與第3張資料表user_video相關聯,下圖為關係圖。一個user會有多個video的借閱紀錄,而且每個video都與多個用戶有關。

image alt

建表時有幾點要特別注意:

  1. 建表順序:Laravel的migration table 在新增時會連帶把檔案時間納入檔名,eg:2019_10_07_013145_create_posts_table,因此在建表時,記得中間表(樞紐表)要最後建立哦,否則它無法辨別user和video表的關係,畢竟就像被插隊一樣,系統自然會報錯啦。

  2. 建表名稱:多對多關係利用一個樞紐表格來連接兩者,命名規範為將兩個表格名稱按照字母順序,並在它們之間加上一個底線來分隔。

  3. 樞紐表的命名較特別,所以不適合使用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)


上一篇
Day22-Laravel新手基礎訓-Eloquent: Relationships-One to Many
下一篇
Day24-Laravel新手基礎訓-Eloquent: Many to Many (Factory 與 Tinker)
系列文
後端PHP+Laravel--新手實戰日記30

尚未有邦友留言

立即登入留言