Model 設定與 Seeding
范聖佑 Shengyou Fan
新北市樹林國⼩小 (2015/07/08)
適
⽤用
5.1
版
單元主題
• 什麼是 Model?什麼是 Seeding?
• 使⽤用 Model 有什麼好處?Laravel 的 Model 機制與實
作慣例
• 使⽤用 Seeding 有什麼好處?如何使⽤用 Laravel 的
Seeding 機制與結合 Faker 產⽣生假資料
• Laravel 5.1 的 ModelFactory 功能
• 依照⼯工作坊實作需求⽰示範如何建⽴立 Model 及 Seeder
類別
Model	
  簡介
Laravel 的 MVC 分⼯工
Route
Controller
ModelView
index.php
Server
Request
Response
Client
app init
★ 參考說明:http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle
在有 Model 之前…
• 每當要連線資料庫時,都要⾃自⾏行撰寫連線語法、設
定連線編碼、組合 SQL 查詢句、維持/關閉資料庫連
結資源 (總之是件苦差事…)
//	
  連線資料庫	
  
$mysqli	
  =	
  new	
  mysqli("DB",	
  "USER",	
  "PASS",	
  "DATABASE");	
  
//	
  檢查連線	
  
if	
  (mysqli_connect_errno())	
  {	
  
/*	
  略	
  */	
  
}	
  
//	
  設定連線編碼	
  
if	
  ($mysqli-­‐>set_charset("utf8"))	
  {	
  
$result	
  =	
  $mysqli-­‐>query("/*	
  SQL	
  查詢句	
  */");	
  
$row	
  =	
  $result-­‐>fetch_assoc();	
  
/*	
  略	
  */	
  
}	
  
//	
  關閉連線	
  
$mysqli-­‐>close();
什麼是 MVC 的 Model?
• MVC 設計架構裡,M 代表 Model 負責處理資料;V
代表View 負責顯⽰示⾴頁⾯面;C 代表 Controller 負責控
制 M 及V 間的溝通並回傳結果
• 在此架構設計下,Model 的功能就是負責處理資料,
通常就是處理跟資料庫的連線、讀取、寫⼊入等,這
些處理資料的邏輯⼀一般會與應⽤用程式的實作⺫⽬目的有
關,也就是所謂的業務邏輯
• 如此即可讓 顯⽰示 (V) 與 程式控制 (C)、商業邏輯 (M)
三者獨⽴立開來,彼此分⼯工、互相合作
Laravel 的 Model 機制
• 在 Laravel 的 MVC 分⼯工裡,只要是跟資料讀寫有關
的動作,都可以透過 Model 類別來操作。簡單來
說,只要是跟資料庫有關的動作,都是使⽤用 Model
來完成
• Laravel 透過實作 ActiveRecord Pattern,讓開發者可
以很⽅方便的透過 Model 類別與資料庫溝通,不⽤用每
次在跟資料庫溝通時,都要⼿手動撰寫連線語法、SQL
查詢句、處理回傳陣列/物件、維持/關閉資料庫連線
狀態等
• 在這個階段先學習如何建⽴立 Model 類別,操作資料
的動作細節會在 ORM ⼀一節說明
建⽴立	
  Model
★ 參考⽂文件:http://laravel.com/docs/5.1/eloquent#defining-models
產⽣生 Model 檔
• 為了讓 Laravel 可以連線⾄至我們所使⽤用的資料庫,務
必先設定 config/database.php 及 .env 裡的資料庫相關
連線設定 (上⼀一⼩小節裡已完成)
• 根據 Laravel 的慣例,⼀一個 Model 對應到⼀一個資料表
(table),所以我們有幾個資料表就會需要幾個 Model
類別檔
• Laravel 的 Model 類別使⽤用⼤大量的慣例,因此⼀一個
Model 類別幾乎只需要繼承⽗父類別、其他什麼都不
⽤用設定就可以使⽤用。不過 artisan 還是有對應的指
令讓我們⼀一⾏行程式碼都不⽤用⾃自⼰己打!
$	
  [php]	
  artisan	
  make:model	
  {name}
產⽣生	
  model	
  檔案
artisan	
  make:model
• 使⽤用 artisan 幫我們產⽣生 Model 的類別檔案
- ⾃自動以傳⼊入的 Model 名稱產⽣生對應的 Model 類別檔
案,節省⼿手動輸⼊入程式碼的時間
• 範例:
$	
  php	
  artisan	
  make:model	
  Post
執⾏行 make:model
使⽤用 artisan 產⽣生 Model 檔案
Model 檔案結構
• ⼀一個 Model 檔只需要⾮非常精簡的幾⾏行結構
Model 慣例
• 產⽣生出來的 Model 檔案,預設會直接放在 app/ 底下
• 資料表的名稱⽤用英⽂文複數;⽽而 Model 的名稱就⽤用英
⽂文單數
• 資料表⽤用英⽂文、全⼩小寫、單字間⽤用蛇底式命名法
(Snake Case);Model 的名稱⽤用英⽂文、⾸首字⼤大寫、單
字間⽤用⼤大駝峰式命名法 (Upper Camel Case)
• 預設的 namespace 是在 App 底下,若要更動位置,
記得要依 PSR-4 更改 namespace
指定 Model 對應到的資料表
• Model 與資料表對應的慣例是 Model 的⼤大駝峰名稱
轉成資料表的蛇底式名稱,若對應不到的話 Laravel
會拋出例外
• 若因特殊原因需要打破這個慣例,可以設定 Model
對應到的資料表名稱
<?php	
  
namespace	
  App;	
  
use	
  IlluminateDatabaseEloquentModel;	
  
class	
  Post	
  extends	
  Model	
  {	
  
	
   protected	
  $table	
  =	
  '{table_name}';	
  
}
把 Model 放到資料夾裡
• 隨著專案使⽤用到的 Model 愈來愈多,可能會想要把
所有 Model 從 app/ 底下放到 app/Models 底下,記得
依以下步驟進⾏行:
- 先在 app 底下建⽴立 Models 資料夾
- 把所有 Model 都搬進資料夾內
- 修正所有 Model 的 namespace 成 AppModels
Seeding	
  簡介
什麼是 Seeding?
• 當我們在寫資料庫相關的程式時,通常會需要測試
資料讀取與顯⽰示是否正常,這時候往往要有⼀一定數
量以上的資料才⽅方便開發/測試使⽤用
• Seed 就是種⼦子,換成資料庫的概念就是⽤用來做測試
的假資料。這些資料只要符合資料庫的欄位屬性即
可,但不需要是真的資料
• 現代框架裡所謂的 Seeding,就是透過撰寫 Seeder 類
別來產⽣生假資料,並可⽤用指令將測試資料⾃自動倒⼊入
資料庫內。省去⼿手動產⽣生資料或⼿手動倒檔的步驟,
就算資料庫清空或是在不同開發環境,也可以很快
速的產⽣生測試程式所需要的資料
在有 Seeding 之前…
• 在沒有 Seeding 設計之前,往往需要開發者⼿手動到表
單⾴頁⾃自⾏行輸⼊入多次資料,將資料寫⼊入⾄至資料庫
• 更有甚者,若暫時還沒有表單輸⼊入的⾴頁⾯面,就得直
接透過資料庫 GUI 將資料⼀一筆⼀一筆的寫⼊入
• 或者是聰明⼀一點,把之前產⽣生出來的假資料 dump 出
來成 sql 檔,每次需要時就將 sql 檔重新倒回資料庫
內
• 不過若是多⼈人開發時,就會變成除了要交換程式碼
之外,也要跟其他開發者索取對應的 sql 檔案
為什麼要⽤用 Seeding?
• 有測試資料很⽅方便也很重要,但⾃自⼰己產⽣生/建⽴立很花
時間,尤其是當這個動作要重複做很多遍的時候是
⾮非常累⼈人也⾮非常浪費時間的 (⼯工程師都很懶…)
• ⽤用 Seeding 後,可以快速的讓資料庫內有測試⽤用的假
資料,寫資料庫相關的操作功能時,可讓開發效率
⼤大增!
• 就算因為測試過程中把資料庫的資料弄亂了,只要
再重新產⽣生⼀一次,就可以把資料庫回復到適合測試
的狀態
Laravel 的 Seeding 機制
• Laravel 本⾝身就內建了 Seeding 的設計,可以快速的產
⽣生測試假資料並倒進資料庫,⽅方便開發以資料操作
為主的資料庫相關功能
• Seeder 類別各⾃自獨⽴立,但預設會透過
DatabaseSeeder 作為程式執⾏行點,統⼀一呼叫需要執
⾏行的 Seeder ⼀一起執⾏行
• artisan 提供 db:seed 指令,當需要 Seeding 時,
可以透過 artisan 完成所有資料產⽣生與倒檔的⼯工作
怎麼做 Seeding?
• ⽤用 artisan 產⽣生 Seeder 檔
• 撰寫 Seeder 檔的內容
• 設定 DatabaseSeeder.php 內的執⾏行序
• 使⽤用 artisan 執⾏行 db 相關指令
• 從 GUI 裡確認執⾏行後的結果
• 確認完成! (commit 到版本控制系統,需要時就執⾏行)
產⽣生	
  Seeder	
  檔
★ 參考⽂文件:http://laravel.com/docs/5.1/seeding
產⽣生 Seeder 檔
• 使⽤用 artisan 內建的 make:seeder 指令產⽣生
Seeder 檔
• Laravel 沒有特別限制撰寫 Seeder 的規定,不過⼀一般
⽽而⾔言會是⼀一個資料表對應⼀一個 Seeder 類別。因此在
範例中我們會⼀一個資料表產⽣生⼀一個 Seeder 類別,⽽而
後透過 DatabaseSeeder 統⼀一呼叫執⾏行
$	
  [php]	
  artisan	
  make:seeder	
  {name}
產⽣生	
  seeder	
  檔案
artisan	
  make:seeder
• 透過 artisan 產⽣生 Seeder 檔
- artisan	
  會⾃自動依照給予的名稱,產⽣生對應的	
  
Seeder	
  類別檔案
• 範例:
$	
  php	
  artisan	
  make:seeder	
  PostsTableSeeder
產⽣生 Seeder 檔案
使⽤用 artisan 產⽣生 Seeder 檔案
命名與指令慣例
• 雖然 Laravel 沒有強制規定,但⼀一般命名慣例是使⽤用
{Model 複數名稱}TableSeeder
• 所有的 Seeder 檔案統⼀一放置在 database/seeds/ 資料
夾底下
撰寫	
  Seeder	
  內容
Seeder 檔結構
• ⼀一個 Seeder 檔裡只有⼀一個 run 函式
• 在 run 函式裡可以寫任何 Laravel 的指令,不過⼀一般
來說會直接操作 DB Facade 和 Model 來新增、寫⼊入、
刪除、清空資料庫的資料
Seeder 檔範例
• ⽤用 artisan 產⽣生出來的 Seeder 檔
撰寫資料產⽣生規則
• 在 run 函式裡直接操作 Model 來產⽣生/寫⼊入資料
//	
  database/seeds/PostsTableSeeder.php	
  
class	
  PostsTableSeeder	
  extends	
  Seeder	
  
{	
  
	
  	
  	
  	
  public	
  function	
  run()	
  
	
  	
  	
  	
  {	
  
	
   	
   foreach(range(1,	
  20)	
  as	
  $number)	
  {	
  
	
   	
   	
   AppPost::create([	
  
	
   	
   	
   	
   'title'	
  =>	
  '測試假⽂文章'.$number,	
  
	
   	
   	
   	
   'sub_title'	
  =>	
  '這是副標題…',	
  
	
   	
   	
   	
   'content'	
  =>	
  '這是假的⽂文章內容…',	
  
	
   	
   	
   	
   'page_view'	
  =>	
  1,	
  
	
   	
   	
   ]);	
  
	
   	
   }	
  
	
  	
  	
  	
  }	
  
}
設定 DatabaseSeeder
• 寫好的 Seeder 預設並不會被執⾏行!記得要在
DatabaseSeeder 裡呼叫 (call) 才有作⽤用,如此可確
保各 Seeder 間的執⾏行順序與相依性
class	
  DatabaseSeeder	
  extends	
  Seeder	
  {	
  
	
   public	
  function	
  run()	
  
	
   {	
  
	
   	
   Model::unguard();	
  
	
   	
   $this-­‐>call(PostsTableSeeder::class);	
  
	
   	
   $this-­‐>call(CommentsTableSeeder::class);	
  
	
   	
   Model::reguard();	
  
	
   }	
  
} call	
  的順序是重要且有相依性的!
unguard、reguard	
  的功能在	
  ORM	
  
⼀一節會說明
執⾏行	
  Seeding
執⾏行 Seeding
• 撰寫完所需的 Seeder 檔案、並設定好
DatabaseSeeder 後,就可以透過 artisan 的指令來
執⾏行 Seeding
• 每⼀一次執⾏行 Seeding,Laravel 就會執⾏行
DatabaseSeeder,並從中依照設定的順序呼叫不同的
Seeder 來產⽣生假資料和寫⼊入資料庫
• 若是 Seeding 過程中有錯誤,記得要⾃自⾏行收拾殘局…
$	
  [php]	
  artisan	
  db:seed
執⾏行	
  Seeding
artisan	
  db:seed
• 呼叫 artisan 執⾏行 Seeding
- artisan 會執⾏行 database/seeds/DatabaseSeeder.php 裡
的 run 函式,依照函式內部的設定呼叫要執⾏行的
Seeder 類別
- -­‐-­‐class={class_name} 若只想要執⾏行指定的
Seeding 類別,可加上這個參數來限定
• 範例:
$	
  php	
  artisan	
  db:seed	
  
$	
  php	
  artisan	
  db:seed	
  -­‐-­‐class=PostsTableSeeder
執⾏行 Seeding
使⽤用 artisan 執⾏行 db:seed
資料庫內驗證
• ⽤用 GUI ⼯工具驗證是否有將資料正確寫⼊入資料庫內
讓	
  Seeder	
  更好⽤用
新增資料前清空資料
• artisan	
  db:seed 指令只會單純的執⾏行 run 的內
容,⾄至於要執⾏行什麼動作、產⽣生什麼結果,完全看
程式裡⾯面怎麼寫 (個⼈人造業個⼈人擔!)
• 所以若指令⼀一直下、⼀一直下,假資料就會⼀一直⻑⾧長、
⼀一直⻑⾧長,這樣在測試時也會造成其他的困擾
• 我們可以使⽤用 DB Facade 或是 Model 的 truncate
指令,在 Seeding 之前先清空資料表,然後再產⽣生假
資料寫⼊入
• 範例:
DB::table('{資料表名稱}')-­‐>truncate();	
  
AppPost::truncate();
讓資料多點隨機感
• 寫⼊入的假資料都是固定值,測試起來會與真實狀況
有所差距
• 在產⽣生資料時,可以利⽤用 rand 函式產⽣生隨機數字,
讓產⽣生出來的資料可以更隨機⼀一些;也可以使⽤用
Carbon 控制⽇日期時間產⽣生間距,讓測試資料不會都
被設定在同⼀一天
• 範例:
'is_feature'	
  =>	
  rand(0,	
  1);	
  
'created_at'	
  =>	
  CarbonCarbon::now()-­‐>addDays($number);
讓假資料更真!
• 寫⼊入的假資料都很呆板,看起來很不真實。因此可
以配合 Faker 套件,讓產⽣生出來的測試資料更像真
的⼀一樣,會更有 Fu!
//	
  database/seeds/PostsTableSeeder.php	
  
public	
  function	
  run()	
  
{	
  
	
   $faker	
  =	
  FakerFactory::create('zh_TW');	
  
	
   	
  
	
   foreach(range(1,	
  20)	
  as	
  $number)	
  {	
  
	
   	
   AppPost::create([	
  
	
   	
   	
   'title'	
  =>	
  $faker-­‐>sentence,	
  
	
   	
   	
   'sub_title'	
  =>	
  $faker-­‐>sentence,	
  
	
   	
   	
   'content'	
  =>	
  $faker-­‐>paragraph,	
  
	
   	
   	
   /*	
  略	
  */	
  
	
   	
   ]);	
  
	
   }	
  
}
Faker 可以產⽣生的資料類型
• 假⽂文字系
-­‐ $faker-­‐>word	
  
-­‐ $faker-­‐>sentence	
  
-­‐ $faker-­‐>paragraph	
  
• 假⾝身份系
-­‐ $faker-­‐>name	
  
-­‐ $faker-­‐>title	
  
-­‐ $faker-­‐>phoneNumber	
  
-­‐ $faker-­‐>address
• 假網路系
-­‐ $faker-­‐>email	
  
-­‐ $faker-­‐>freeEmail	
  
-­‐ $faker-­‐>userName	
  
-­‐ $faker-­‐>password	
  
-­‐ $faker-­‐>url	
  
-­‐ $faker-­‐>ipv4	
  
-­‐ $faker-­‐>ipv6	
  
-­‐ $faker-­‐>macAddress
Model	
  Factory
★ 參考⽂文件:http://laravel.com/docs/5.1/seeding#using-model-factories
Model Factory
• 在 Laravel 5.1 為了更⽅方便開發者整合測試,推出了
Model Factory 功能,讓產⽣生測試資料、撰寫 Seeder
及整合測試流程更加的流暢
• 如何使⽤用 Model Factory?
- 在 databases/factories/ModelFactory.php 內定義
Model 欄位資料格式
- 在 Seeder 裡呼叫 factory() helper function 並設定
相關參與
定義 ModelFactory
• 在 database/factories/ModelFactory.php 裡定義每⼀一個
Model 內各欄位的資料產⽣生規則
• 在 $factory-­‐>define() 裡預設就會把 Faker 傳
⼊入,所以可以直接使⽤用 Faker 的各種 API
//	
  database/factories/ModelFactory.php	
  
$factory-­‐>define(AppPost::class,	
  function	
  ($faker)	
  {	
  
	
  	
  	
  	
  return	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  'title'	
  =>	
  $faker-­‐>sentence,	
  
	
  	
  	
  	
  	
  	
  	
  	
  'sub_title'	
  =>	
  $faker-­‐>sentence,	
  
	
  	
  	
  	
  	
  	
  	
  	
  'content'	
  =>	
  $faker-­‐>paragraph,	
  
	
  	
  	
  	
  	
  	
  	
  	
  'page_view'	
  =>	
  rand(0,	
  20),	
  
	
  	
  	
  	
  ];	
  
});
修改 Seeder 內容
• 原本寫在 Seeder 裡的資料產⽣生邏輯已經被移到
Model Factory 內。因此可以⼤大⼤大簡化 Seeder 檔的內
容
• 只需要在 Seeder 內設定清空資料庫及設定要產⽣生的
資料筆數即可
//	
  database/seeder/PostsTableSeeder.php	
  
public	
  function	
  run()	
  
{	
  
	
   AppPost::truncate();	
  
	
   	
  
	
   factory(AppPost::class,	
  10)-­‐>create();	
  
}
實作專案	
  Seeding	
  檔
專案資料庫設計
建⽴立 Model/Seeder 檔案
• 針對專案應⽤用程式需要的兩個資料表,⽤用
make:model 來產⽣生兩個 Model 檔
• 針對專案應⽤用程式需要的兩個資料表,⽤用
make:seeder 來產⽣生兩個 Seeder 檔
• 撰寫 Seeder 檔的內容、設定 ModelFactory
• 設定 DatabaseSeeder 呼叫兩個 Seeder
• 執⾏行 db:seed
• 在 GUI 裡檢查結果是否正確
存檔點
• 試著把現在已經可以運作的程式碼加⼊入版本控制內
• 流程提醒:
- working directory > staging area > commit
單元總結
• 在這個單元裡我們學到了些什麼?
- Model、Seeding 的基礎概念
- 如何使⽤用 Model 讓 Laravel 連線資料庫
- 如何使⽤用 Seeding 及使⽤用 Seeding 的好處
- 如何在 Seeder 裡使⽤用 Model 寫⼊入資料庫
- 讓 Seeding 資料更加擬真的技巧
- 使⽤用 ModelFactory 產⽣生 Seeding 的⽅方式
Q & A
歡迎提問討論

More Related Content

PDF
Model 設定與 Seeding
PDF
使用 Controller
PDF
Package 安裝與使用
PDF
整合 Open ID
PDF
CRUD 綜合運用
PDF
Migrations 與 Schema 操作
PDF
Model & Seeding整合
PDF
Eloquent ORM
Model 設定與 Seeding
使用 Controller
Package 安裝與使用
整合 Open ID
CRUD 綜合運用
Migrations 與 Schema 操作
Model & Seeding整合
Eloquent ORM

What's hot (20)

PDF
Laravel - 系統全攻略
PDF
CRUD 綜合運用
PDF
Eloquent ORM
PDF
驗證與訊息
PDF
Laravel - 系統全攻略(續)
PDF
開發環境建置
PDF
驗證與訊息
PDF
View 與 Blade 樣板引擎
PDF
View 與 Blade 樣板引擎
PDF
Package安裝與使用
PDF
啟動 Laravel 與環境設定
PDF
使用 Controller
PDF
Composer 套件管理
PDF
開發環境建置
PDF
應用程式佈署
PDF
PHP 語法基礎與物件導向
PDF
Route路由控制
PDF
工作坊總結
PDF
Route 路由控制
PDF
COSCUP 2016 Laravel 部署工作坊 - 部署指南
Laravel - 系統全攻略
CRUD 綜合運用
Eloquent ORM
驗證與訊息
Laravel - 系統全攻略(續)
開發環境建置
驗證與訊息
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
Package安裝與使用
啟動 Laravel 與環境設定
使用 Controller
Composer 套件管理
開發環境建置
應用程式佈署
PHP 語法基礎與物件導向
Route路由控制
工作坊總結
Route 路由控制
COSCUP 2016 Laravel 部署工作坊 - 部署指南
Ad

Viewers also liked (12)

PDF
使用者認證
PDF
工作坊簡介
PDF
使用 Eloquent ORM
PDF
CRUD 綜合應用
PDF
專案啟動與設定
PDF
開發流程與工具介紹
PDF
使用者認證
PDF
View 與 Blade 樣板引擎
PDF
課程簡介
PDF
開發環境建置
PDF
Route 機制
PDF
Schema & Migration操作
使用者認證
工作坊簡介
使用 Eloquent ORM
CRUD 綜合應用
專案啟動與設定
開發流程與工具介紹
使用者認證
View 與 Blade 樣板引擎
課程簡介
開發環境建置
Route 機制
Schema & Migration操作
Ad

Similar to Model 設定與 Seeding (20)

PDF
使用 laravel 的前與後
PDF
深度學習(Deep learning)概論- 使用 SAS EM 實做
PDF
Migrations 與 Schema操作
PDF
Java Build Tool course in 2011
PPTX
How to ASP.NET MVC4
PDF
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
PDF
給你一個使用 Laravel 的理由
PDF
專案啟動與環境設定
PDF
Laradebut #5 - 關於 CRUD 外的一點小事
PPT
02.web sphere培训 应用websphere
PDF
合久必分,分久必合
PPTX
Code guidelines
PPT
Java SE 8 技術手冊第 5 章 - 物件封裝
PDF
网站前端代码静态检查工具综述
PDF
Web development with zend framework
PDF
Raising The MySQL Bar-Manyi Lu
PPT
互联网创业服务器运维工具集
PDF
网站前端代码静态检查工具研究
PPT
MySQL入門介紹
PPTX
Laravel 5.2 教學
使用 laravel 的前與後
深度學習(Deep learning)概論- 使用 SAS EM 實做
Migrations 與 Schema操作
Java Build Tool course in 2011
How to ASP.NET MVC4
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
給你一個使用 Laravel 的理由
專案啟動與環境設定
Laradebut #5 - 關於 CRUD 外的一點小事
02.web sphere培训 应用websphere
合久必分,分久必合
Code guidelines
Java SE 8 技術手冊第 5 章 - 物件封裝
网站前端代码静态检查工具综述
Web development with zend framework
Raising The MySQL Bar-Manyi Lu
互联网创业服务器运维工具集
网站前端代码静态检查工具研究
MySQL入門介紹
Laravel 5.2 教學

More from Shengyou Fan (20)

PDF
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
PDF
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
PDF
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
PDF
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
PDF
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
PDF
How I make a podcast website using serverless technology in 2023
PDF
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
PDF
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
PDF
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
PDF
Using the Exposed SQL Framework to Manage Your Database
PDF
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
PDF
[COSCUP 2022] Kotlin Collection 遊樂園
PDF
初探 Kotlin Multiplatform
PDF
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
PDF
[PHP 也有 Day #64] PHP 升級指南
PDF
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
PDF
Composer 經典食譜
PDF
老派浪漫:用 Kotlin 寫 Command Line 工具
PDF
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
PDF
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
How I make a podcast website using serverless technology in 2023
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
Using the Exposed SQL Framework to Manage Your Database
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] Kotlin Collection 遊樂園
初探 Kotlin Multiplatform
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
[PHP 也有 Day #64] PHP 升級指南
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
Composer 經典食譜
老派浪漫:用 Kotlin 寫 Command Line 工具
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API

Model 設定與 Seeding

  • 1. Model 設定與 Seeding 范聖佑 Shengyou Fan 新北市樹林國⼩小 (2015/07/08) 適 ⽤用 5.1 版
  • 2. 單元主題 • 什麼是 Model?什麼是 Seeding? • 使⽤用 Model 有什麼好處?Laravel 的 Model 機制與實 作慣例 • 使⽤用 Seeding 有什麼好處?如何使⽤用 Laravel 的 Seeding 機制與結合 Faker 產⽣生假資料 • Laravel 5.1 的 ModelFactory 功能 • 依照⼯工作坊實作需求⽰示範如何建⽴立 Model 及 Seeder 類別
  • 4. Laravel 的 MVC 分⼯工 Route Controller ModelView index.php Server Request Response Client app init ★ 參考說明:http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle
  • 5. 在有 Model 之前… • 每當要連線資料庫時,都要⾃自⾏行撰寫連線語法、設 定連線編碼、組合 SQL 查詢句、維持/關閉資料庫連 結資源 (總之是件苦差事…) //  連線資料庫   $mysqli  =  new  mysqli("DB",  "USER",  "PASS",  "DATABASE");   //  檢查連線   if  (mysqli_connect_errno())  {   /*  略  */   }   //  設定連線編碼   if  ($mysqli-­‐>set_charset("utf8"))  {   $result  =  $mysqli-­‐>query("/*  SQL  查詢句  */");   $row  =  $result-­‐>fetch_assoc();   /*  略  */   }   //  關閉連線   $mysqli-­‐>close();
  • 6. 什麼是 MVC 的 Model? • MVC 設計架構裡,M 代表 Model 負責處理資料;V 代表View 負責顯⽰示⾴頁⾯面;C 代表 Controller 負責控 制 M 及V 間的溝通並回傳結果 • 在此架構設計下,Model 的功能就是負責處理資料, 通常就是處理跟資料庫的連線、讀取、寫⼊入等,這 些處理資料的邏輯⼀一般會與應⽤用程式的實作⺫⽬目的有 關,也就是所謂的業務邏輯 • 如此即可讓 顯⽰示 (V) 與 程式控制 (C)、商業邏輯 (M) 三者獨⽴立開來,彼此分⼯工、互相合作
  • 7. Laravel 的 Model 機制 • 在 Laravel 的 MVC 分⼯工裡,只要是跟資料讀寫有關 的動作,都可以透過 Model 類別來操作。簡單來 說,只要是跟資料庫有關的動作,都是使⽤用 Model 來完成 • Laravel 透過實作 ActiveRecord Pattern,讓開發者可 以很⽅方便的透過 Model 類別與資料庫溝通,不⽤用每 次在跟資料庫溝通時,都要⼿手動撰寫連線語法、SQL 查詢句、處理回傳陣列/物件、維持/關閉資料庫連線 狀態等 • 在這個階段先學習如何建⽴立 Model 類別,操作資料 的動作細節會在 ORM ⼀一節說明
  • 9. 產⽣生 Model 檔 • 為了讓 Laravel 可以連線⾄至我們所使⽤用的資料庫,務 必先設定 config/database.php 及 .env 裡的資料庫相關 連線設定 (上⼀一⼩小節裡已完成) • 根據 Laravel 的慣例,⼀一個 Model 對應到⼀一個資料表 (table),所以我們有幾個資料表就會需要幾個 Model 類別檔 • Laravel 的 Model 類別使⽤用⼤大量的慣例,因此⼀一個 Model 類別幾乎只需要繼承⽗父類別、其他什麼都不 ⽤用設定就可以使⽤用。不過 artisan 還是有對應的指 令讓我們⼀一⾏行程式碼都不⽤用⾃自⼰己打!
  • 10. $  [php]  artisan  make:model  {name} 產⽣生  model  檔案
  • 11. artisan  make:model • 使⽤用 artisan 幫我們產⽣生 Model 的類別檔案 - ⾃自動以傳⼊入的 Model 名稱產⽣生對應的 Model 類別檔 案,節省⼿手動輸⼊入程式碼的時間 • 範例: $  php  artisan  make:model  Post
  • 12. 執⾏行 make:model 使⽤用 artisan 產⽣生 Model 檔案
  • 13. Model 檔案結構 • ⼀一個 Model 檔只需要⾮非常精簡的幾⾏行結構
  • 14. Model 慣例 • 產⽣生出來的 Model 檔案,預設會直接放在 app/ 底下 • 資料表的名稱⽤用英⽂文複數;⽽而 Model 的名稱就⽤用英 ⽂文單數 • 資料表⽤用英⽂文、全⼩小寫、單字間⽤用蛇底式命名法 (Snake Case);Model 的名稱⽤用英⽂文、⾸首字⼤大寫、單 字間⽤用⼤大駝峰式命名法 (Upper Camel Case) • 預設的 namespace 是在 App 底下,若要更動位置, 記得要依 PSR-4 更改 namespace
  • 15. 指定 Model 對應到的資料表 • Model 與資料表對應的慣例是 Model 的⼤大駝峰名稱 轉成資料表的蛇底式名稱,若對應不到的話 Laravel 會拋出例外 • 若因特殊原因需要打破這個慣例,可以設定 Model 對應到的資料表名稱 <?php   namespace  App;   use  IlluminateDatabaseEloquentModel;   class  Post  extends  Model  {     protected  $table  =  '{table_name}';   }
  • 16. 把 Model 放到資料夾裡 • 隨著專案使⽤用到的 Model 愈來愈多,可能會想要把 所有 Model 從 app/ 底下放到 app/Models 底下,記得 依以下步驟進⾏行: - 先在 app 底下建⽴立 Models 資料夾 - 把所有 Model 都搬進資料夾內 - 修正所有 Model 的 namespace 成 AppModels
  • 18. 什麼是 Seeding? • 當我們在寫資料庫相關的程式時,通常會需要測試 資料讀取與顯⽰示是否正常,這時候往往要有⼀一定數 量以上的資料才⽅方便開發/測試使⽤用 • Seed 就是種⼦子,換成資料庫的概念就是⽤用來做測試 的假資料。這些資料只要符合資料庫的欄位屬性即 可,但不需要是真的資料 • 現代框架裡所謂的 Seeding,就是透過撰寫 Seeder 類 別來產⽣生假資料,並可⽤用指令將測試資料⾃自動倒⼊入 資料庫內。省去⼿手動產⽣生資料或⼿手動倒檔的步驟, 就算資料庫清空或是在不同開發環境,也可以很快 速的產⽣生測試程式所需要的資料
  • 19. 在有 Seeding 之前… • 在沒有 Seeding 設計之前,往往需要開發者⼿手動到表 單⾴頁⾃自⾏行輸⼊入多次資料,將資料寫⼊入⾄至資料庫 • 更有甚者,若暫時還沒有表單輸⼊入的⾴頁⾯面,就得直 接透過資料庫 GUI 將資料⼀一筆⼀一筆的寫⼊入 • 或者是聰明⼀一點,把之前產⽣生出來的假資料 dump 出 來成 sql 檔,每次需要時就將 sql 檔重新倒回資料庫 內 • 不過若是多⼈人開發時,就會變成除了要交換程式碼 之外,也要跟其他開發者索取對應的 sql 檔案
  • 20. 為什麼要⽤用 Seeding? • 有測試資料很⽅方便也很重要,但⾃自⼰己產⽣生/建⽴立很花 時間,尤其是當這個動作要重複做很多遍的時候是 ⾮非常累⼈人也⾮非常浪費時間的 (⼯工程師都很懶…) • ⽤用 Seeding 後,可以快速的讓資料庫內有測試⽤用的假 資料,寫資料庫相關的操作功能時,可讓開發效率 ⼤大增! • 就算因為測試過程中把資料庫的資料弄亂了,只要 再重新產⽣生⼀一次,就可以把資料庫回復到適合測試 的狀態
  • 21. Laravel 的 Seeding 機制 • Laravel 本⾝身就內建了 Seeding 的設計,可以快速的產 ⽣生測試假資料並倒進資料庫,⽅方便開發以資料操作 為主的資料庫相關功能 • Seeder 類別各⾃自獨⽴立,但預設會透過 DatabaseSeeder 作為程式執⾏行點,統⼀一呼叫需要執 ⾏行的 Seeder ⼀一起執⾏行 • artisan 提供 db:seed 指令,當需要 Seeding 時, 可以透過 artisan 完成所有資料產⽣生與倒檔的⼯工作
  • 22. 怎麼做 Seeding? • ⽤用 artisan 產⽣生 Seeder 檔 • 撰寫 Seeder 檔的內容 • 設定 DatabaseSeeder.php 內的執⾏行序 • 使⽤用 artisan 執⾏行 db 相關指令 • 從 GUI 裡確認執⾏行後的結果 • 確認完成! (commit 到版本控制系統,需要時就執⾏行)
  • 23. 產⽣生  Seeder  檔 ★ 參考⽂文件:http://laravel.com/docs/5.1/seeding
  • 24. 產⽣生 Seeder 檔 • 使⽤用 artisan 內建的 make:seeder 指令產⽣生 Seeder 檔 • Laravel 沒有特別限制撰寫 Seeder 的規定,不過⼀一般 ⽽而⾔言會是⼀一個資料表對應⼀一個 Seeder 類別。因此在 範例中我們會⼀一個資料表產⽣生⼀一個 Seeder 類別,⽽而 後透過 DatabaseSeeder 統⼀一呼叫執⾏行
  • 25. $  [php]  artisan  make:seeder  {name} 產⽣生  seeder  檔案
  • 26. artisan  make:seeder • 透過 artisan 產⽣生 Seeder 檔 - artisan  會⾃自動依照給予的名稱,產⽣生對應的   Seeder  類別檔案 • 範例: $  php  artisan  make:seeder  PostsTableSeeder
  • 27. 產⽣生 Seeder 檔案 使⽤用 artisan 產⽣生 Seeder 檔案
  • 28. 命名與指令慣例 • 雖然 Laravel 沒有強制規定,但⼀一般命名慣例是使⽤用 {Model 複數名稱}TableSeeder • 所有的 Seeder 檔案統⼀一放置在 database/seeds/ 資料 夾底下
  • 30. Seeder 檔結構 • ⼀一個 Seeder 檔裡只有⼀一個 run 函式 • 在 run 函式裡可以寫任何 Laravel 的指令,不過⼀一般 來說會直接操作 DB Facade 和 Model 來新增、寫⼊入、 刪除、清空資料庫的資料
  • 31. Seeder 檔範例 • ⽤用 artisan 產⽣生出來的 Seeder 檔
  • 32. 撰寫資料產⽣生規則 • 在 run 函式裡直接操作 Model 來產⽣生/寫⼊入資料 //  database/seeds/PostsTableSeeder.php   class  PostsTableSeeder  extends  Seeder   {          public  function  run()          {       foreach(range(1,  20)  as  $number)  {         AppPost::create([           'title'  =>  '測試假⽂文章'.$number,           'sub_title'  =>  '這是副標題…',           'content'  =>  '這是假的⽂文章內容…',           'page_view'  =>  1,         ]);       }          }   }
  • 33. 設定 DatabaseSeeder • 寫好的 Seeder 預設並不會被執⾏行!記得要在 DatabaseSeeder 裡呼叫 (call) 才有作⽤用,如此可確 保各 Seeder 間的執⾏行順序與相依性 class  DatabaseSeeder  extends  Seeder  {     public  function  run()     {       Model::unguard();       $this-­‐>call(PostsTableSeeder::class);       $this-­‐>call(CommentsTableSeeder::class);       Model::reguard();     }   } call  的順序是重要且有相依性的! unguard、reguard  的功能在  ORM   ⼀一節會說明
  • 35. 執⾏行 Seeding • 撰寫完所需的 Seeder 檔案、並設定好 DatabaseSeeder 後,就可以透過 artisan 的指令來 執⾏行 Seeding • 每⼀一次執⾏行 Seeding,Laravel 就會執⾏行 DatabaseSeeder,並從中依照設定的順序呼叫不同的 Seeder 來產⽣生假資料和寫⼊入資料庫 • 若是 Seeding 過程中有錯誤,記得要⾃自⾏行收拾殘局…
  • 36. $  [php]  artisan  db:seed 執⾏行  Seeding
  • 37. artisan  db:seed • 呼叫 artisan 執⾏行 Seeding - artisan 會執⾏行 database/seeds/DatabaseSeeder.php 裡 的 run 函式,依照函式內部的設定呼叫要執⾏行的 Seeder 類別 - -­‐-­‐class={class_name} 若只想要執⾏行指定的 Seeding 類別,可加上這個參數來限定 • 範例: $  php  artisan  db:seed   $  php  artisan  db:seed  -­‐-­‐class=PostsTableSeeder
  • 39. 資料庫內驗證 • ⽤用 GUI ⼯工具驗證是否有將資料正確寫⼊入資料庫內
  • 41. 新增資料前清空資料 • artisan  db:seed 指令只會單純的執⾏行 run 的內 容,⾄至於要執⾏行什麼動作、產⽣生什麼結果,完全看 程式裡⾯面怎麼寫 (個⼈人造業個⼈人擔!) • 所以若指令⼀一直下、⼀一直下,假資料就會⼀一直⻑⾧長、 ⼀一直⻑⾧長,這樣在測試時也會造成其他的困擾 • 我們可以使⽤用 DB Facade 或是 Model 的 truncate 指令,在 Seeding 之前先清空資料表,然後再產⽣生假 資料寫⼊入 • 範例: DB::table('{資料表名稱}')-­‐>truncate();   AppPost::truncate();
  • 42. 讓資料多點隨機感 • 寫⼊入的假資料都是固定值,測試起來會與真實狀況 有所差距 • 在產⽣生資料時,可以利⽤用 rand 函式產⽣生隨機數字, 讓產⽣生出來的資料可以更隨機⼀一些;也可以使⽤用 Carbon 控制⽇日期時間產⽣生間距,讓測試資料不會都 被設定在同⼀一天 • 範例: 'is_feature'  =>  rand(0,  1);   'created_at'  =>  CarbonCarbon::now()-­‐>addDays($number);
  • 43. 讓假資料更真! • 寫⼊入的假資料都很呆板,看起來很不真實。因此可 以配合 Faker 套件,讓產⽣生出來的測試資料更像真 的⼀一樣,會更有 Fu! //  database/seeds/PostsTableSeeder.php   public  function  run()   {     $faker  =  FakerFactory::create('zh_TW');         foreach(range(1,  20)  as  $number)  {       AppPost::create([         'title'  =>  $faker-­‐>sentence,         'sub_title'  =>  $faker-­‐>sentence,         'content'  =>  $faker-­‐>paragraph,         /*  略  */       ]);     }   }
  • 44. Faker 可以產⽣生的資料類型 • 假⽂文字系 -­‐ $faker-­‐>word   -­‐ $faker-­‐>sentence   -­‐ $faker-­‐>paragraph   • 假⾝身份系 -­‐ $faker-­‐>name   -­‐ $faker-­‐>title   -­‐ $faker-­‐>phoneNumber   -­‐ $faker-­‐>address • 假網路系 -­‐ $faker-­‐>email   -­‐ $faker-­‐>freeEmail   -­‐ $faker-­‐>userName   -­‐ $faker-­‐>password   -­‐ $faker-­‐>url   -­‐ $faker-­‐>ipv4   -­‐ $faker-­‐>ipv6   -­‐ $faker-­‐>macAddress
  • 46. Model Factory • 在 Laravel 5.1 為了更⽅方便開發者整合測試,推出了 Model Factory 功能,讓產⽣生測試資料、撰寫 Seeder 及整合測試流程更加的流暢 • 如何使⽤用 Model Factory? - 在 databases/factories/ModelFactory.php 內定義 Model 欄位資料格式 - 在 Seeder 裡呼叫 factory() helper function 並設定 相關參與
  • 47. 定義 ModelFactory • 在 database/factories/ModelFactory.php 裡定義每⼀一個 Model 內各欄位的資料產⽣生規則 • 在 $factory-­‐>define() 裡預設就會把 Faker 傳 ⼊入,所以可以直接使⽤用 Faker 的各種 API //  database/factories/ModelFactory.php   $factory-­‐>define(AppPost::class,  function  ($faker)  {          return  [                  'title'  =>  $faker-­‐>sentence,                  'sub_title'  =>  $faker-­‐>sentence,                  'content'  =>  $faker-­‐>paragraph,                  'page_view'  =>  rand(0,  20),          ];   });
  • 48. 修改 Seeder 內容 • 原本寫在 Seeder 裡的資料產⽣生邏輯已經被移到 Model Factory 內。因此可以⼤大⼤大簡化 Seeder 檔的內 容 • 只需要在 Seeder 內設定清空資料庫及設定要產⽣生的 資料筆數即可 //  database/seeder/PostsTableSeeder.php   public  function  run()   {     AppPost::truncate();         factory(AppPost::class,  10)-­‐>create();   }
  • 51. 建⽴立 Model/Seeder 檔案 • 針對專案應⽤用程式需要的兩個資料表,⽤用 make:model 來產⽣生兩個 Model 檔 • 針對專案應⽤用程式需要的兩個資料表,⽤用 make:seeder 來產⽣生兩個 Seeder 檔 • 撰寫 Seeder 檔的內容、設定 ModelFactory • 設定 DatabaseSeeder 呼叫兩個 Seeder • 執⾏行 db:seed • 在 GUI 裡檢查結果是否正確
  • 53. 單元總結 • 在這個單元裡我們學到了些什麼? - Model、Seeding 的基礎概念 - 如何使⽤用 Model 讓 Laravel 連線資料庫 - 如何使⽤用 Seeding 及使⽤用 Seeding 的好處 - 如何在 Seeder 裡使⽤用 Model 寫⼊入資料庫 - 讓 Seeding 資料更加擬真的技巧 - 使⽤用 ModelFactory 產⽣生 Seeding 的⽅方式