一對多:每家店 Store ,可以賣很多種的商品
多對多:每家店 Store 除了可以賣很多商品外,每種商品也可以在很多家商店販售
多對多的情況下,沒有辦法單純只用兩個表格來表達彼此的關係,必須要透過第三個表格來協助,大部分時候,第三個表格會存放兩方的 id
Book
- hasMany authors
Author
- hasMany books
author_book 此為第三方表格,表格名稱會按英文字母排列順序+小寫命名
此表格至少要包含前兩張表的名稱+ id,即 book_id 跟 author_id
練習使用書店及作者的關聯,來了解多對多
之前的練習中,已經有 Book 的 Model 了,現在建立 Author 的
執行 php artisan make:model Author -m 創建 Model
到 database/migrations 的那張資料結構表加上 name 欄位
再到 App/Models/Author.php 設定可以針對 name 做大量新增的動作
到 App/Models/Book.php 新增 function authors() ,並且使用 belongsToMany(‘App\Models\Author’) ,來表示這本書,由很多作者協作
目前為止,在 Model 層做的還不夠,還有讓 books 跟 authors 相關連的第三方表格 author_book
兩個 belongsToMany 設定好後,執行 php artisan make:migration create_table_author_book,並且將 table 名稱改為 author_book
加上關聯 books 跟 authors 兩張表的 id,並設定可為空值
打開 SQLite 查看資料表是否有產生
現在,可以到 php artisan tinker 內測試多對多了
我們在 tinker 內先建立一個作者,因為 authors 中還沒有資料
$a1 = Author::create([‘name’=>’鳥山明’])
目前為止,書跟作者還尚未有關連,所以查詢都是空的
接下來從 book 或從 author 的角度做都可以,這裡從書的角度做
將 $a1 存到 $b1 中(一本書可以有很多個作者的角度做新增)
再試著新增另外一本書到 author_book 關聯表中,現在先找到"為你自己學Git"這本書
剛剛使用 $b1 新增關聯,現在反過來,試試使用 $a1 (一個作者可以有很多書)的角度新增關聯
我們重新執行 php artisan tinker 查看,鳥山明這個作者有哪些書
$a = Author::first()
找到作者鳥山明後,看他有哪些書 $a->books
我們可以使用迴圈印出,模擬在 view 時可以撈到怎樣的資料