Laravel 學習筆記 — 資料與工廠模式

ViNciHsu
5 min readOct 15, 2020

--

姑且將工廠看成一個用來快速生產其他物件的物件;對於快速產生測試要用的資了/假資料很有幫助

創建一個跟 Book 有關的工廠:php artisan make:factory BookFactory — model=Book

該檔案會在 database/factories/BookFactory.php

想要產生的假資料,就寫在 definition() 內

針對 definition() 內需要產生資料的欄位做設定
針對 title,description,price 產生資料

這裡的 make() 並非真的已經寫到資料庫去了,只是產生資料,暫時放在記憶體內

如果想一次做多筆假資料的話,可以使用 count(假資料筆數)

count(3) 就會一次產生 3 筆假資料

create() 才會真的將資料寫到資料庫,Book::factory()->create() ,如下圖:

Book::factory()->create() 將假資料寫進資料庫
在 SQLite 查看確實新增了剛才的假資料

由於產生的假資料都是隨機的,如果不想要隨機產生的話,也可以針對欄位自己定義要寫入的內容

針對 title / description 欄位自己定義要寫入的內容

剛才試做一個給書的工廠,現在試做一個給商店的工廠

建造一個 Store 工廠,php artisan make:factory StoreFactory — model=Store

因為商店跟書的關係為多對多,在 Store.php 中用了 hasMany('App\Models\Book'),所以

Store::factory()->has(Book::factory()->count(3))->create()

嘗試白話翻譯:用 Store 的工廠模式做出東西,並且用 has 這方法(hasMany) 要新增3本書,最後用 create() 產生

產生了 "Quincy Kunze Sr." 的書店

到自料庫看的話,就會看到 stores 多了一間店,而 books ,則多了3本書

stores 資料表多了一間店

books 資料表多了3本書,這3本書的 store_id 為3,即為 stores 資料表中的"Quincy Kunze Sr."商店

books 資料表多了3本書,這3本書的 store_id = 3

如果要反向,從書的角度建立資料,可以這麼做:

當時 Book.php 是用 belongsTo
Store.php 是用 hasMany

Book::factory()->for(Store::factory())->make(['title'=>'為自己學'])

由於 Book.php 中,stroe() 內是用 belongsTo 想要連商店資料一起建立的話,此處要使用 for() ,而不是剛剛的 has()

從 books 資料表的角度產生資料,給予 store_id = 5 去對應 stores 資料表中 id 為5的商店
stores.id 為5的商店

另外,如果命名名稱有命名好的話 ↓

Store::factory()->has(Book::factory()->count(3))->create() 可以改成下方a魔術方法 hasBooks()

Store::factory()->hasBooks(3)->create()

Tremaine Maggio 這家商店,id 為6,對照資料庫查看資料表 stores.id 以及 books.store_id

Tremaine Maggio 這家商店,id 為6
對照 books 中 store_id = 6

同樣的,剛才使用 for() 的也能使用魔術方法(magic relationship methods)寫資料

Book::factory()->for(Store::factory())->create(['title'=>'新手道場'])

可以改成

Book::factory()->forStore()->create(['title'=>'新手道場'])

--

--

No responses yet