Laravel 學習筆記 — 資料與工廠模式
姑且將工廠看成一個用來快速生產其他物件的物件;對於快速產生測試要用的資了/假資料很有幫助
創建一個跟 Book 有關的工廠:php artisan make:factory BookFactory — model=Book
該檔案會在 database/factories/BookFactory.php
想要產生的假資料,就寫在 definition() 內
這裡的 make() 並非真的已經寫到資料庫去了,只是產生資料,暫時放在記憶體內
如果想一次做多筆假資料的話,可以使用 count(假資料筆數)
create() 才會真的將資料寫到資料庫,Book::factory()->create() ,如下圖:
由於產生的假資料都是隨機的,如果不想要隨機產生的話,也可以針對欄位自己定義要寫入的內容
剛才試做一個給書的工廠,現在試做一個給商店的工廠
建造一個 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() 產生
到自料庫看的話,就會看到 stores 多了一間店,而 books ,則多了3本書
books 資料表多了3本書,這3本書的 store_id 為3,即為 stores 資料表中的"Quincy Kunze Sr."商店
如果要反向,從書的角度建立資料,可以這麼做:
Book::factory()->for(Store::factory())->make(['title'=>'為自己學'])
由於 Book.php 中,stroe() 內是用 belongsTo 想要連商店資料一起建立的話,此處要使用 for() ,而不是剛剛的 has()
另外,如果命名名稱有命名好的話 ↓
Store::factory()->has(Book::factory()->count(3))->create() 可以改成下方a魔術方法 hasBooks()
Store::factory()->hasBooks(3)->create()
Tremaine Maggio 這家商店,id 為6,對照資料庫查看資料表 stores.id 以及 books.store_id
同樣的,剛才使用 for() 的也能使用魔術方法(magic relationship methods)寫資料
Book::factory()->for(Store::factory())->create(['title'=>'新手道場'])
可以改成
Book::factory()->forStore()->create(['title'=>'新手道場'])