SlideShare a Scribd company logo
1 of 50
Download to read offline
Model 設定與 Seeding
范聖佑 Shengyou Fan
臺中科⼤大資⼯工系 (2015/06/13)
適
⽤用
5.0
版
單元主題
• 什麼是 Model?什麼是 Seeding?
• 使⽤用 Model 有什麼好處?Laravel 的 Model 機制與實
作慣例
• 使⽤用 Seeding 有什麼好處?如何使⽤用 Laravel 的
Seeding 機制與結合 Faker 產⽣生假資料
• 依照⼯工作坊實作需求⽰示範如何建⽴立 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.0/eloquent#introduction
產⽣生 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 類別檔
案,節省⼿手動輸⼊入程式碼的時間
- -­‐-­‐no-­‐migration	
  預設指令會⾃自動產⽣生對應的
migration 檔案,若不希望⾃自動產⽣生的話,可加上這
個參數
• 範例:
$	
  php	
  artisan	
  make:model	
  Post	
  -­‐-­‐no-­‐migration
執⾏行 make:model
使⽤用 artisan 產⽣生 Model 檔案
Model 檔案結構
• ⼀一個 Model 檔只需要⾮非常精簡的幾⾏行結構
Model 慣例
• 產⽣生出來的 Model 檔案,預設會直接放在 app/ 底下
• 資料表的名稱⽤用英⽂文複數;⽽而 Model 的名稱就⽤用英
⽂文單數
• 資料表⽤用英⽂文、全⼩小寫、單字間⽤用蛇底式命名法
(Snake Case);Model 的名稱⽤用英⽂文、⾸首字⼤大寫、單
字間⽤用⼤大駝峰式命名法 (Upper Camel Case)
• 預設的 namespace 是在 App 底下,若要更動位置,
記得要依 PSR-4 更改 namespace,並在修改後執⾏行
composer	
  dump-­‐autoload
指定 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
- 執⾏行 composer	
  dump-­‐autoload 重建 Class Map
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 的執⾏行序
• 使⽤用 artisan 執⾏行 db 相關指令
• 從 GUI 裡確認執⾏行後的結果
• 確認完成! (commit 到版本控制系統,需要時就執⾏行)
產⽣生	
  Seeder	
  檔
★ 參考⽂文件:http://laravel.com/docs/5.0/migrations#database-seeding
產⽣生 Seeder 檔
• artisan 內建沒有產⽣生 Seeder 檔的功能。因此在之前
的單元裡,我們已經安裝 laracasts/generators
這個套件,可以⽤用套件加掛的指令來產⽣生 Seeder 檔
• Laravel 沒有特別限制撰寫 Seeder 的規定,不過⼀一般
⽽而⾔言會是⼀一個資料表對應⼀一個 Seeder 類別。因此在
範例中我們會⼀一個資料表產⽣生⼀一個 Seeder 類別,⽽而
後透過 DatabaseSeeder 統⼀一呼叫執⾏行
$	
  [php]	
  artisan	
  make:seed	
  {name}
產⽣生	
  seeder	
  檔案
artisan	
  make:seed
• 透過 artisan 產⽣生 Seeder 檔
- artisan	
  會⾃自動依照給予的名稱,產⽣生	
  {名
稱}TableSeeder	
  的	
  Seeder	
  類別
• 範例:
$	
  php	
  artisan	
  make:seed	
  posts
產⽣生 Seeder 檔案
使⽤用 artisan 產⽣生 Seeder 檔案
命名與指令慣例
• 雖然 Laravel 沒有強制規定,但⼀一般慣例會在
make:seed 指令後⾯面給要產⽣生的 Model 複數名稱。
⽽而 artisan 就會將該複數名串上 TableSeeder 做
為類別的名稱
• 所有的 Seeder 檔案統⼀一放置在 database/seeds/ 資料
夾底下
撰寫	
  Seeder	
  內容
Seeder 檔結構
• ⼀一個 Seeder 檔裡只有⼀一個 run 函式
• 在 run 函式裡可以寫任何 Laravel 的指令,不過⼀一般
來說會直接操作 DB Facade 和 Model 來新增、寫⼊入、
刪除、清空資料庫的資料
• 由 laracasts/generators 產⽣生的 Seeder 檔,會
預設⽰示範使⽤用 TestDummy 做假資料的產⽣生與測試

(不過在本次⼯工作坊內不會使⽤用到相關的功能,因此在⽰示範時會暫時更換這
部份的寫法)
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'	
  =>	
  '這是假的⽂文章內容…',	
  
	
   	
   	
   	
   'is_hot'	
  =>	
  false,	
  
	
   	
   	
   	
   'created_at'	
  =>	
  date('Y-­‐m-­‐d	
  H:i:s'),	
  
	
   	
   	
   	
   'updated_at'	
  =>	
  date('Y-­‐m-­‐d	
  H:i:s'),	
  
	
   	
   	
   ]);	
  
	
   	
   }	
  
	
  	
  	
  	
  }	
  
}
設定 DatabaseSeeder
• 寫好的 Seeder 預設並不會被執⾏行!記得要在
DatabaseSeeder 裡呼叫 (call) 才有作⽤用,如此可確
保各 Seeder 間的執⾏行順序與相依性
class	
  DatabaseSeeder	
  extends	
  Seeder	
  {	
  
	
   public	
  function	
  run()	
  
	
   {	
  
	
   	
   Model::unguard();	
  
	
   	
   $this-­‐>call('PostsTableSeeder');	
  
	
   	
   $this-­‐>call('ContactTableSeeder');	
  
	
   }	
  
}
call	
  的順序是重要且有相依性的!
unguard	
  的功能在	
  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="ContactTableSeeder"
執⾏行 Seeding
使⽤用 artisan 執⾏行 db:seed
資料庫內驗證
• ⽤用 GUI ⼯工具驗證是否有將資料正確寫⼊入資料庫內
讓	
  Seeder	
  更好⽤用
新增資料前清空資料
• artisan	
  db:seed 指令只會單純的執⾏行 run 的內
容,⾄至於要執⾏行什麼動作、產⽣生什麼結果,完全看
程式裡⾯面怎麼寫 (個⼈人造業個⼈人擔!)
• 所以若指令⼀一直下、⼀一直下,假資料就會⼀一直⻑⾧長、
⼀一直⻑⾧長,這樣在測試時也會造成其他的困擾
• 我們可以使⽤用 DB Facade 在 Seeding 之前先清空資料
表,然後再產⽣生假資料寫⼊入
• 範例:
DB::table('{資料表名稱}')-­‐>truncate();
讓資料多點隨機感
• 寫⼊入的假資料都是固定值,測試起來會與真實狀況
有所差距
• 在產⽣生資料時,可以利⽤用 rand 函式產⽣生隨機數字,
讓產⽣生出來的資料可以更隨機⼀一些;也可以使⽤用
Carbon 控制⽇日期時間產⽣生間距,讓測試資料不會都
被設定在同⼀一天
• 範例:
'is_hot'	
  =>	
  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
實作專案	
  Seeding	
  檔
專案資料庫設計
建⽴立 Model/Seeder 檔案
• 針對專案應⽤用程式需要的三個資料表,⽤用
make:model 來產⽣生三個 Model 檔
• 針對專案應⽤用程式需要的三個資料表,⽤用
make:seed 來產⽣生三個 Seeder 檔
• 撰寫 Seeder 檔的內容
• 設定 DatabaseSeeder 呼叫三個 Seeder
• 執⾏行 db:seed
• 在 GUI 裡檢查結果是否正確
存檔點
• 試著把現在已經可以運作的程式碼加⼊入版本控制內
• 流程提醒:
- working directory > staging area > commit
單元總結
• 在這個單元裡我們學到了些什麼?
- Model、Seeding 的基礎概念
- 如何使⽤用 Model 讓 Laravel 連線資料庫
- 如何使⽤用 Seeding 及使⽤用 Seeding 的好處
- 如何在 Seeder 裡使⽤用 Model 寫⼊入資料庫
- 讓 Seeding 資料更加擬真的技巧
Q & A
歡迎提問討論

More Related Content

What's hot

View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用Shengyou Fan
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合Shengyou Fan
 
Laravel - 系統全攻略
Laravel - 系統全攻略Laravel - 系統全攻略
Laravel - 系統全攻略Vincent Chi
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
應用程式部署
應用程式部署應用程式部署
應用程式部署Shengyou Fan
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由Shengyou Fan
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定Shengyou Fan
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制Shengyou Fan
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向Shengyou Fan
 
Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理Shengyou Fan
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作Shengyou Fan
 

What's hot (20)

View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合
 
Laravel - 系統全攻略
Laravel - 系統全攻略Laravel - 系統全攻略
Laravel - 系統全攻略
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
應用程式部署
應用程式部署應用程式部署
應用程式部署
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
Route路由控制
Route路由控制Route路由控制
Route路由控制
 
使用 Controller
使用 Controller使用 Controller
使用 Controller
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理
 
使用者認證
使用者認證使用者認證
使用者認證
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作
 

Viewers also liked

Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作Shengyou Fan
 
使用 Eloquent ORM
使用 Eloquent ORM使用 Eloquent ORM
使用 Eloquent ORMShengyou Fan
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹Shengyou Fan
 

Viewers also liked (16)

Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
Route 機制
Route 機制Route 機制
Route 機制
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
CRUD 綜合應用
CRUD 綜合應用CRUD 綜合應用
CRUD 綜合應用
 
使用者認證
使用者認證使用者認證
使用者認證
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作
 
課程簡介
課程簡介課程簡介
課程簡介
 
使用 Eloquent ORM
使用 Eloquent ORM使用 Eloquent ORM
使用 Eloquent ORM
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 

Similar to Model 設定與 Seeding

使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後Shengyou Fan
 
深度學習(Deep learning)概論- 使用 SAS EM 實做
深度學習(Deep learning)概論- 使用 SAS EM 實做深度學習(Deep learning)概論- 使用 SAS EM 實做
深度學習(Deep learning)概論- 使用 SAS EM 實做SAS TW
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011Ching Yi Chan
 
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝Justin Lin
 
【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學ilovejoomla
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事Szuping Wang
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料yiditushe
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4Daniel Chou
 
I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212Asika Simon
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Wade Huang
 
Eclipse開發平台快速入門
Eclipse開發平台快速入門Eclipse開發平台快速入門
Eclipse開發平台快速入門Luo Korth
 
Laravel 5.2 教學
Laravel 5.2 教學Laravel 5.2 教學
Laravel 5.2 教學Cloud Wu
 
Django development
Django developmentDjango development
Django developmentloveyudu
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集zhen chen
 
Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend frameworkthinkinlamp
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Justin Lin
 

Similar to Model 設定與 Seeding (18)

使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後
 
深度學習(Deep learning)概論- 使用 SAS EM 實做
深度學習(Deep learning)概論- 使用 SAS EM 實做深度學習(Deep learning)概論- 使用 SAS EM 實做
深度學習(Deep learning)概論- 使用 SAS EM 實做
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
 
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
 
【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
SCJP ch17
SCJP ch17SCJP ch17
SCJP ch17
 
Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4
 
I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享
 
Eclipse開發平台快速入門
Eclipse開發平台快速入門Eclipse開發平台快速入門
Eclipse開發平台快速入門
 
Laravel 5.2 教學
Laravel 5.2 教學Laravel 5.2 教學
Laravel 5.2 教學
 
Django development
Django developmentDjango development
Django development
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集
 
Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend framework
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
 

More from Shengyou Fan

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

More from Shengyou Fan (20)

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

Model 設定與 Seeding

  • 1. Model 設定與 Seeding 范聖佑 Shengyou Fan 臺中科⼤大資⼯工系 (2015/06/13) 適 ⽤用 5.0 版
  • 2. 單元主題 • 什麼是 Model?什麼是 Seeding? • 使⽤用 Model 有什麼好處?Laravel 的 Model 機制與實 作慣例 • 使⽤用 Seeding 有什麼好處?如何使⽤用 Laravel 的 Seeding 機制與結合 Faker 產⽣生假資料 • 依照⼯工作坊實作需求⽰示範如何建⽴立 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 類別檔 案,節省⼿手動輸⼊入程式碼的時間 - -­‐-­‐no-­‐migration  預設指令會⾃自動產⽣生對應的 migration 檔案,若不希望⾃自動產⽣生的話,可加上這 個參數 • 範例: $  php  artisan  make:model  Post  -­‐-­‐no-­‐migration
  • 12. 執⾏行 make:model 使⽤用 artisan 產⽣生 Model 檔案
  • 13. Model 檔案結構 • ⼀一個 Model 檔只需要⾮非常精簡的幾⾏行結構
  • 14. Model 慣例 • 產⽣生出來的 Model 檔案,預設會直接放在 app/ 底下 • 資料表的名稱⽤用英⽂文複數;⽽而 Model 的名稱就⽤用英 ⽂文單數 • 資料表⽤用英⽂文、全⼩小寫、單字間⽤用蛇底式命名法 (Snake Case);Model 的名稱⽤用英⽂文、⾸首字⼤大寫、單 字間⽤用⼤大駝峰式命名法 (Upper Camel Case) • 預設的 namespace 是在 App 底下,若要更動位置, 記得要依 PSR-4 更改 namespace,並在修改後執⾏行 composer  dump-­‐autoload
  • 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 - 執⾏行 composer  dump-­‐autoload 重建 Class Map
  • 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 的執⾏行序 • 使⽤用 artisan 執⾏行 db 相關指令 • 從 GUI 裡確認執⾏行後的結果 • 確認完成! (commit 到版本控制系統,需要時就執⾏行)
  • 23. 產⽣生  Seeder  檔 ★ 參考⽂文件:http://laravel.com/docs/5.0/migrations#database-seeding
  • 24. 產⽣生 Seeder 檔 • artisan 內建沒有產⽣生 Seeder 檔的功能。因此在之前 的單元裡,我們已經安裝 laracasts/generators 這個套件,可以⽤用套件加掛的指令來產⽣生 Seeder 檔 • Laravel 沒有特別限制撰寫 Seeder 的規定,不過⼀一般 ⽽而⾔言會是⼀一個資料表對應⼀一個 Seeder 類別。因此在 範例中我們會⼀一個資料表產⽣生⼀一個 Seeder 類別,⽽而 後透過 DatabaseSeeder 統⼀一呼叫執⾏行
  • 25. $  [php]  artisan  make:seed  {name} 產⽣生  seeder  檔案
  • 26. artisan  make:seed • 透過 artisan 產⽣生 Seeder 檔 - artisan  會⾃自動依照給予的名稱,產⽣生  {名 稱}TableSeeder  的  Seeder  類別 • 範例: $  php  artisan  make:seed  posts
  • 27. 產⽣生 Seeder 檔案 使⽤用 artisan 產⽣生 Seeder 檔案
  • 28. 命名與指令慣例 • 雖然 Laravel 沒有強制規定,但⼀一般慣例會在 make:seed 指令後⾯面給要產⽣生的 Model 複數名稱。 ⽽而 artisan 就會將該複數名串上 TableSeeder 做 為類別的名稱 • 所有的 Seeder 檔案統⼀一放置在 database/seeds/ 資料 夾底下
  • 30. Seeder 檔結構 • ⼀一個 Seeder 檔裡只有⼀一個 run 函式 • 在 run 函式裡可以寫任何 Laravel 的指令,不過⼀一般 來說會直接操作 DB Facade 和 Model 來新增、寫⼊入、 刪除、清空資料庫的資料 • 由 laracasts/generators 產⽣生的 Seeder 檔,會 預設⽰示範使⽤用 TestDummy 做假資料的產⽣生與測試
 (不過在本次⼯工作坊內不會使⽤用到相關的功能,因此在⽰示範時會暫時更換這 部份的寫法)
  • 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'  =>  '這是假的⽂文章內容…',           'is_hot'  =>  false,           'created_at'  =>  date('Y-­‐m-­‐d  H:i:s'),           'updated_at'  =>  date('Y-­‐m-­‐d  H:i:s'),         ]);       }          }   }
  • 33. 設定 DatabaseSeeder • 寫好的 Seeder 預設並不會被執⾏行!記得要在 DatabaseSeeder 裡呼叫 (call) 才有作⽤用,如此可確 保各 Seeder 間的執⾏行順序與相依性 class  DatabaseSeeder  extends  Seeder  {     public  function  run()     {       Model::unguard();       $this-­‐>call('PostsTableSeeder');       $this-­‐>call('ContactTableSeeder');     }   } call  的順序是重要且有相依性的! unguard  的功能在  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="ContactTableSeeder"
  • 39. 資料庫內驗證 • ⽤用 GUI ⼯工具驗證是否有將資料正確寫⼊入資料庫內
  • 41. 新增資料前清空資料 • artisan  db:seed 指令只會單純的執⾏行 run 的內 容,⾄至於要執⾏行什麼動作、產⽣生什麼結果,完全看 程式裡⾯面怎麼寫 (個⼈人造業個⼈人擔!) • 所以若指令⼀一直下、⼀一直下,假資料就會⼀一直⻑⾧長、 ⼀一直⻑⾧長,這樣在測試時也會造成其他的困擾 • 我們可以使⽤用 DB Facade 在 Seeding 之前先清空資料 表,然後再產⽣生假資料寫⼊入 • 範例: DB::table('{資料表名稱}')-­‐>truncate();
  • 42. 讓資料多點隨機感 • 寫⼊入的假資料都是固定值,測試起來會與真實狀況 有所差距 • 在產⽣生資料時,可以利⽤用 rand 函式產⽣生隨機數字, 讓產⽣生出來的資料可以更隨機⼀一些;也可以使⽤用 Carbon 控制⽇日期時間產⽣生間距,讓測試資料不會都 被設定在同⼀一天 • 範例: 'is_hot'  =>  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
  • 47. 建⽴立 Model/Seeder 檔案 • 針對專案應⽤用程式需要的三個資料表,⽤用 make:model 來產⽣生三個 Model 檔 • 針對專案應⽤用程式需要的三個資料表,⽤用 make:seed 來產⽣生三個 Seeder 檔 • 撰寫 Seeder 檔的內容 • 設定 DatabaseSeeder 呼叫三個 Seeder • 執⾏行 db:seed • 在 GUI 裡檢查結果是否正確
  • 49. 單元總結 • 在這個單元裡我們學到了些什麼? - Model、Seeding 的基礎概念 - 如何使⽤用 Model 讓 Laravel 連線資料庫 - 如何使⽤用 Seeding 及使⽤用 Seeding 的好處 - 如何在 Seeder 裡使⽤用 Model 寫⼊入資料庫 - 讓 Seeding 資料更加擬真的技巧