一對多:每家店 Store ,可以賣很多種的商品

多對多:每家店 Store 除了可以賣很多商品外,每種商品也可以在很多家商店販售

多對多的情況下,沒有辦法單純只用兩個表格來表達彼此的關係,必須要透過第三個表格來協助,大部分時候,第三個表格會存放兩方的 id

截圖出自 高見龍 - 為你自己學 Laravel 影片中,連結:https://www.youtube.com/watch?v=f27hDi3hunE&ab_channel=%E9%AB%98%E8%A6%8B%E9%BE%8D

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 欄位

migration 的資料結構表加上 name 欄位

再到 App/Models/Author.php 設定可以針對 name 做大量新增的動作

設定可以針對 name 做大量新增的動作

到 App/Models/Book.php 新增 function authors() ,並且使用 belongsToMany(‘App\Models\Author’) ,來表示這本書,由很多作者協作

使用 belongsToMany 對應到 Author.php
使用 belongsToMany 對應到 Book.php

目前為止,在 Model 層做的還不夠,還有讓 books 跟 authors 相關連的第三方表格 author_book

兩個 belongsToMany 設定好後,執行 php artisan make:migration create_table_author_book,並且將 table 名稱改為 author_book

table 名稱原為 table_author_book
將 table 名稱改為 author_book

加上關聯 books 跟 authors 兩張表的 id,並設定可為空值

關聯 books 跟 authors 兩張表的 id,並設定可為空值

打開 SQLite 查看資料表是否有產生

產生了新的資料表 author_book

現在,可以到 php artisan tinker 內測試多對多了

我們在 tinker 內先建立一個作者,因為 authors 中還沒有資料

$a1 = Author::create([‘name’=>’鳥山明’])

建立一個作者

目前為止,書跟作者還尚未有關連,所以查詢都是空的

書跟作者還尚未有關連

接下來從 book 或從 author 的角度做都可以,這裡從書的角度做

將 $a1 存到 $b1 中(一本書可以有很多個作者的角度做新增)

查看 author_book 表中是否新增了關聯資料

再試著新增另外一本書到 author_book 關聯表中,現在先找到"為你自己學Git"這本書

找到”為你自己學Git”這本書

剛剛使用 $b1 新增關聯,現在反過來,試試使用 $a1 (一個作者可以有很多書)的角度新增關聯

使用 $a1 的角度新增關聯
新增關聯成功

我們重新執行 php artisan tinker 查看,鳥山明這個作者有哪些書

$a = Author::first()

讓 $a 為鳥山明這個作者

找到作者鳥山明後,看他有哪些書 $a->books

可以看到此時鳥山明有兩本書

我們可以使用迴圈印出,模擬在 view 時可以撈到怎樣的資料

使用 foreach 印出兩本書的書名

--

--

No responses yet