Cyber Coding Course

師其意,不泥其跡

Laravel思緒整理,從Model到DatabaseSeeder.

本文將一步一步介紹相關的指令用例:
Model=>Factory=>Seeder=>DatabaseSeeder
一步一腳印,讓我們就從Model開始檢視所有流程到DatabaseSeeder。

您閱讀本文前,您應該要了解Laravel中的 make:migration相關用途

一、 Model (模型)
透過簡單的ActiveRecord輕鬆的對資料庫進行修改,簡單說,讓我們以物件的方式進行資料的修改。
您可以由這裡看到Active Record說明,這裡引用RailsGuids的文章給大家參考。

那在Laravel中如何建Model呢? 記得請用單數,一個物件Model Object代表是單數,
例如$obj->title而不是$objs->title。
php artisan make:model Content

上方指令,建立了一個名為Content的model,這個Model預設對映到資料表中的 contents 資料表,
因為資料表內會有多筆資料,所以資料表是 contents 複數,非常符合邏輯,

當然,我們也可以自訂Mode所對映的Table名稱,例如,我在Content.php這個Model中加入如下:
protected $table='content';

為何這樣做,絕對不是因為我任性,也不是這樣做比較屌或是裝逼,
是因為這是舊程式轉Laravel,這個 content table 已存在很久,被我列為古蹟了,動不得,
無法更名為contents。

所以Laravel的Model提供高度的自由,雖然有預設的規則,但是我們也可以依自己的狀況及需求調整
諸如table名稱,或是PK欄位(id)等,但是,如果您是新的專案,請勿任性自訂Table的名稱或PK哦!
殊殊用法例外,這裡不在多做說明。

二、Factory(工廠)
在Lravel的5.5後,可以對各別的Model,建立各別的工廠。
先來看看指令:
php artisan make:factory StudentSahreFactory

在上方的指令中,即可建立一個 StudentShareFactory.php 工廠,工廠通常用來建假資料。
上方指令,在這間工廠( StudentShareFactory )中,我定義(define)了一個 App\Student Model
並透過 Faker 產生假資料,存入欄位中(下圖)。

在下方的Sample中可能較原來Laravel預設的複雜一點,但是基本執行一次就會建立一筆假資料到students的資料表中 ,
這裡我有一個有趣的使用方式,我的 c_index 欄,需要依序新增,
也就是我建立一百筆資料時,c_index欄,要依序,由1加到100,所以我建了一個自訂的Class處理這件事情。
factory

有了Facetory後,我們可以在透過Tinker( php artisan tinker )提供的指令,輕鬆建立單筆或多筆的假資料了。
下圖中(Tinker的互動模式),透過 factory ,我建立了 10 筆隨機的假資料,到students資料表。
tinker

三、Seeder(播種者)
Seeder的用途,讓我們可以不透過手動執行 tinker 來建立假資料。
如何建seeder,我想,大家或許猜到了,當然就是 make:seeder (產生:播種者)。
我想讀到這裡,您應該已經會 make:model make:factory 了,
並且使用 php artisan tinker 建立假資料。
php artisan make:seeder StudentShareSeeder

上方的指令中,我建立了一個 StudentSahreSeeder.php ,產生後,用我們的編輯器找到該檔,
在下圖run()的 methods 內,再補上剛我在Tinker中所用的建假資料的工廠指令,
例如這裡,也就是當這個run()被執行時,就可以一口氣建立300筆假資料。
seeder
我們可以用db:seed --class=指令,來執行指定的Seeder,
例如這裡的StudentShareSeeder,即可產生300筆的假資料,
一個新的網站沒假資料怎麼套版呢,您說是吧。
php artisan db:seed --class=StudentShareSeeder

未指定--class時, php artisan db:seed ,預設他會呼叫DatabaseSeeder.php
註: seeder不止可以拿來產生假資料,也可以拿來產生一個Project最初所所需要的真資料。

四、DatabaseSeeder
要能快速的建立一個可運作的開發環境,當然不需要手動下那麼多指令,應該就是用 db:seed 即可。
當不指定--class時,預設就會採用 DatabaseSeeder
在下圖的DatabaseSeeder.php中,可以看見,我呼叫了一堆的Seeder。
DatabaseSeeder
所以一個可被重覆使用的Project,我會執行migration後,再執行db:seed
來產生後台所需的基本資料。

舉例: 我套版的後台固定的新增修刪功能及模組化的表單,因此不需搞個網站就重寫一次新增修刪,
當我要套版一個新的網站時,我只需git clone後台的Project下來。
再執行composer install,調整.env(網站域名,OAuth主機指定)及建資料庫等動作,然後再執行php artisan migratephp artisan db:seed,搞定,我就能登入至後台設定所需的表單樣式等功能,及產生假資料了,
然後依美工給我的靜態頁進行blade前台套版了,所以套版後台,可被重覆使用,
透過db:seed讓我可以快速的建立起整個後台運作基本環境。
php artisan db:seed

在上方指令執行後,他會跑DatabaseSeeder,瞬間產生定義好,我開發時所需要的測試資料囉,
所以有了db:seed,拿來建立Project最初所需要的共用資料,不論自用還是他用都非常方便的。

在上圖的例子中,我的OwBaseSeeder,跑的可不是factory,而是LaravelQuery Builder
來看看我這裡的OwBaseSeeder.php怎麼跑Insert基本的資料。
Query Builder

五、help(幫助)
再讓我們回到Model, make:model 指令相當多好用的參數,這裡以Laravel 5.5為例。
-a或是-m等。
我們對於Laravel的artisan命令有不了解,想了解更多時,都可以使用 help 這個 keyword 取得說明。
php artisan help make:model
help command
例如,在建Model的同時,順便一起產生其他需要檔案,例如: Factory、Controller及migration檔案等。
底下,示意圖:
隨便測試的指令
 

作者: Devin Yang