SlideShare une entreprise Scribd logo
1  sur  36
Télécharger pour lire hors ligne
Eloquent ORM
范聖佑 Shengyou Fan
新北市樹林國⼩小 (2015/07/09)
適
⽤用
5.1
版
單元主題
• 什麼是 ORM?
• Laravel 的 ORM 慣例以及如何透過 ORM 對資料做新
增、查詢、更新、刪除等動作
• ORM 間如何設定欄位的關聯?
• 什麼是 tinker 互動指令⼯工具?tinker 可以幫助我
們什麼?
• 設定⼯工作坊專案所需的 ORM 關聯
artisan	
  tinker	
  簡介
tinker 互動指令列
• PHP 本⾝身就有內建互動指令 (REPL) 模式,可以在這個
模式底下測試 PHP 程式碼,並⽴立即獲得回饋
- $	
  php	
  -­‐a
• 從 Laravel 4.1 開始整合了 Boris,提供 tinker 互動指
令列功能,除了進⼊入 PHP 的 REPL 模式外,並加載
Laravel 所有物件環境,讓開發者可以在指令模式底下
測試 Laravel 程式碼 (Boris 相依於 pcntl 外掛,Windows 平台沒有實
作,因此 tinker 在 Windows 底下功能受限)
• Laravel 5.0 則是將 Boris 更換為 psysh,除了讓 tinker
功能更多外,也讓 Windows 開發者有完全的功能
$	
  [php]	
  artisan	
  tinker
進⼊入	
  tinker	
  互動指令列
artisan	
  tinker
• 進⼊入 PHP 互動 (REPL) 模式,並載⼊入 Laravel 環境
- 可以直接在指令模式下測試 PHP 程式碼,或是實驗
如何操作 Laravel 物件
- 可⽤用 exit 或⽤用 Ctrl-­‐C 結束 tinker 模式
• 範例:
$	
  php	
  artisan	
  tinker	
  
Psy	
  Shell	
  v0.4.4	
  (PHP	
  5.6.10	
  —	
  cli)	
  by	
  Justin	
  Hileman	
  
>>>	
  echo	
  'Hello,	
  tinker!'	
  
Hello,	
  tinker! 	
  
=>	
  null	
  
>>>	
  exit	
  
Exit:	
  	
  Goodbye.
tinker	
  畫⾯面
在 artisan tinker 底下測試 Laravel 程式
dd() 測試⼯工具
• Laravel 內建的除錯函式
• 在 Laravel 4.2 版以前,dd() 其實就是把變數丟進
var_dump() 後 exit()
• 在 Laravel 5.0 後,dd() 升級成呼叫 Symfony 的
VarDumper 元件,畫⾯面更好⽤用了!
• 可以在任何地⽅方使⽤用,測試程式碼流程、邏輯、了
解物件內容
• 範例:
$post	
  =	
  'Hello,	
  world!';	
  
dd($post);
使⽤用	
  Eloquent	
  ORM
★ 參考⽂文件:http://laravel.com/docs/5.1/eloquent
什麼是 ORM?
• Object-Relational Mapping
• 在寫資料庫查詢時,往往需要組合 SQL 查詢式,除
了要⾃自⾏行處理字串跳脫等安全性防護機制外,也要
⾃自⾏行轉換從資料庫取出的資料格式。當查詢式變⻑⾧長、
關聯⽇日趨複雜時,在撰寫對應的功能時會更為⾟辛苦
• ⽽而 ORM 則是依照慣例,把資料庫裡⼀一筆⼀一筆的資料
變成類似物件的概念來操作。這些物件透過繼承增
加了更多的⽅方法,讓資料庫的操作 (CRUD) 更加直
覺、⽅方便
Laravel 的 ORM 慣例
• Laravel 的 Model/ORM 依照以下慣例:
- ⼀一種資源 (resource) 對應到資料庫裡的⼀一個資料表
(table)
- ⼀一個 Model 對應到資料表裡的⼀一列 (row)
- 每⼀一個 Model 裡預設都要有⼀一個 auto-increment 的
id 做為 primary key,並預設有 created_at 及
updated_at 紀錄 Model 產⽣生及更新的時間戳記
- 資料表的名稱⽤用英⽂文複數、蛇底式命名;⽽而 Model
的名稱就⽤用英⽂文單數、⼤大駝峰式命名
查詢資料
• 取出全部資料
- Model::all()
• ⽤用 primary key 取出單或數筆資料
- Model::find($id)、Model::find([/*	
  ids	
  */])
• 增加查詢條件式
- Model::where('欄位',	
  '條件',	
  '值')
- Model::orderBy('欄位',	
  '排序⽅方式')
• 串聯多個條件
- Model::where(/*略*/)-­‐>orderBy(/*略*/)-­‐>get()
Collection 類別
• Laravel 實作了 Collection 類別,擴充了原有陣列
(array) 的功能,讓從資料表取出來的資料更好操作
• ⽤用 Eloquent 查詢取得的回傳物件就是 Collection,由
於其實作了數個 PHP 預先定義的介⾯面,包括:
ArrayAccess、Arrayable、Countable、
IteratorAggregate、Jsonable、
JsonSerializable,所以可以直接當陣列使⽤用,或
是直接輸出成 JSON 格式
Collection 的運⽤用⽅方式
• 透過 Model 查詢資料庫後,Laravel 會回傳⼀一個
Collection 物件,裡⾯面放了回傳資料的 Model ,其⾏行
為就像陣列⼀一樣,可以⽀支援⽤用 foreach 取出資料
• 若是⽤用於 API,也可直接轉成 JSON 輸出
$posts	
  =	
  AppPost::all();	
  //	
  $posts	
  是	
  Collection	
  
foreach($posts	
  as	
  $post)	
  
{	
  
	
  	
  	
  	
  echo	
  $post-­‐>title;	
  //	
  $post	
  是	
  Model	
  
}
$posts	
  =	
  AppPost::all();	
  
return	
  $posts-­‐>toJson();
Helper 與 Facade
• 平常也可以將陣列轉成 Collection 使⽤用,可以⽤用
collect() helper function 或 Collection Facade
//	
  使⽤用	
  helper	
  function	
  
$collection	
  =	
  collect([1,	
  2,	
  3]);	
  
//	
  使⽤用	
  Facade	
  
$collection	
  =	
  Collection::make([1,	
  2,	
  3]);
是 Model 還是 Collection?
• 若是查詢回傳的是⼀一個資料集 (Recordset) 就是
Collection;若查詢回傳的是⼀一筆資料 (Row) 就是
Model
//	
  Collection	
  
$posts	
  =	
  AppPost::all();	
  
$hotPosts	
  =	
  AppPost::where('is_feature',	
  1)-­‐>get();	
  
//	
  Model	
  
$post	
  =	
  AppPost::find($id);	
  
$post	
  =	
  AppPost::orderBy(/*略*/)-­‐>first();	
  
新增資料
• 使⽤用 new 建構式
- 直接使⽤用 new 建構式產⽣生 Model 實體,再存檔
• 範例:
$post	
  =	
  new	
  AppPost;	
  
$post-­‐>title	
  =	
  'My	
  Post	
  Title';	
  
$post-­‐>save();
新增資料
• 使⽤用 Facade 的 create ⽅方法
- 直接從陣列新增⼀一筆資料,陣列的 key 值⾃自動對應
到資料表的欄位
• 語法:
- Model::create($array)
• 範例:
$post	
  =	
  AppPost::create([	
  
	
   'title'	
  =>	
  'My	
  Title',	
  
	
   'sub_title'	
  =>	
  'My	
  Sub	
  Title',	
  
	
   'content'	
  =>	
  'Post	
  Content',	
  
	
   'is_feature'	
  =>	
  true,	
  
]);
Mass Assignment
• Laravel 的 ORM 可以直接⽤用 Mass Assignment 的⽅方式
直接新增資料,透過陣列 key 值與資料表欄位名稱
的對應可以迅速的將資料寫⼊入資料庫內
• 這樣的作法雖然語法簡潔、快速⽅方便,但若使⽤用不
當可能會有安全性問題,⽐比⽅方說密碼欄位有可能因
此被覆寫
• 為了提升安全性,在 Model 裡預設將所有的欄位都
設定為不可使⽤用 Mass Assignment 做為防禦⼿手段。若
要使⽤用的話,則要設定 fillable 屬性將要使⽤用
Mass Assignment 的欄位打開
Mass Assignment 警⽰示
設定 fillable、guarded
• 在 Model 內設定 fillable 屬性,指定哪些欄位可
以透過 Mass Assignment 來寫⼊入/更新資料
• guarded 則是相反的屬性,設定後可以保護特定欄
位不使⽤用 Mass Assignment
• 範例:
class	
  Post	
  extends	
  Model	
  {	
  
	
   protected	
  $fillable	
  =	
  [	
  
	
   	
   'title',	
  
	
   	
   'sub_title',	
  
	
   	
   'content',	
  
	
   	
   'is_feature'	
  
	
   ];	
  
	
   protected	
  $guarded	
  =	
  ['id',	
  'password'];	
  
}
刪除資料
• 使⽤用 Model 的 delete ⽅方法
- 先取出 Model 實體後,再刪除
• 語法:
- $model-­‐>delete()
• 範例:
$post	
  =	
  AppPost::find(1);	
  
$post-­‐>delete();
刪除資料
• 使⽤用 Facade 的 destroy ⽅方法
- ⽤用 primary key 刪除對應的資料,可⽀支援多筆刪除
• 語法:
- Model::destroy(/*	
  primary	
  key	
  */)
• 範例:
//	
  使⽤用	
  primary	
  key	
  刪除⼀一筆資料	
  
AppPost::destroy(1);	
  
//	
  使⽤用	
  array	
  刪除多筆資料	
  
AppPost::destroy([1,	
  2,	
  3]);	
  
//	
  使⽤用多參數傳值刪除多筆資料	
  
AppPost::destroy(1,	
  2,	
  3);
更新資料
• 使⽤用 Model 的 update ⽅方法
- 先將資料庫取出 Model 實體,再從陣列更新資料,
陣列的 key 值⾃自動對應到資料表的欄位
• 語法:
- $model-­‐>update($array)
• 範例:
$post	
  =	
  AppPost::find(1);	
  
$post-­‐>update([	
  
	
   'title'	
  =>	
  'new	
  title',	
  
	
   'sub_title'	
  =>	
  'new	
  sub	
  title',	
  
	
   'content'	
  =>	
  'new	
  content',	
  
	
   'is_feature'	
  =>	
  false,	
  
]);
儲存資料
• 使⽤用 Model 的 save ⽅方法
- 先取出 Model 實體後,再針對屬性更新,全部完成
後再存檔
• 語法:
- $model-­‐>save()
• 範例:
$post	
  =	
  AppPost::find(1);	
  
$post-­‐>title	
  =	
  'My	
  New	
  Title';	
  
$post-­‐>sub_title	
  =	
  'My	
  New	
  Sub	
  Title';	
  
$post-­‐>content	
  =	
  'My	
  New	
  Content';	
  
$post-­‐>is_feature	
  =	
  false;	
  
$post-­‐>save();
資料表關聯
★ 參考⽂文件:http://laravel.com/docs/5.1/eloquent-relationships
資料表間的關聯
Model 關聯類型
• A 擁有多個 B
- ⼀一對多
- 例:⼀一個 Post 有很多個 Comment
- hasMany()
• B 歸屬於 A
- ⼀一對多反向
- 例:每個 Comment 都會屬於⼀一個 Post
- belongsTo()
資料關聯設定
• 只要在 Model 內定義⾃自⼰己與其他 Model 間的關聯類
型,Laravel 就會⾃自動將這個關聯變成物件間的屬
性,在查詢時完全不需要⾃自⾏行下 SQL 語法
• 語法:
• 範例:
public	
  function	
  {另⼀一個	
  Model	
  的名稱(單/複數)}()	
  
{	
  
	
  	
  	
  	
  return	
  $this-­‐>{關聯類型}('{Model	
  名稱}');	
  
}
/*	
  app/Post.php	
  */	
  
public	
  function	
  comments()	
  
{	
  
	
  	
  	
  	
  return	
  $this-­‐>hasMany('AppComment');	
  
}
透過 Model 取得關聯資料
• 由於 ORM 已經把資料表的 row 變成⼀一個物件,row
裡的資料變成物件的屬性值,⽽而物件間的關聯也⼀一
樣是屬性值,透過這個屬性值就可以取得關聯後的
Model,再⽤用⼀一樣的⽅方式印出該 Model 的資料即可
• 範例:
//	
  先取得	
  Post	
  實體	
  
$post	
  =	
  AppPost::find(1);	
  
echo	
  $post-­‐>title;	
  
//	
  把	
  Post	
  的	
  Comment	
  印出來	
  
foreach($post-­‐>comments	
  as	
  $comment)	
  
{	
  
	
  	
  	
  	
  //	
  $post-­‐>comments	
  是⼀一個	
  Collection	
  
	
  	
  	
  	
  //	
  $comment	
  就是	
  Comment	
  Model	
  
	
  	
  	
  	
  echo	
  $comment-­‐>content;	
  
}
設定專案	
  Model
專案資料庫設計
設定 Model、測試 Eloquent
• 設定三個 Model 內的 fillable 屬性
• 設定 Post 及 Comment 兩個 Model 的資料關聯
• 在 php	
  artisan	
  tinker 裡測試 Eloquent 的使⽤用⽅方
式
• 在 app/Http/routes.php 裡測試 Eloquent 的使⽤用⽅方式
• 練習 dd() 的使⽤用⽅方式
存檔點
• 試著把現在已經可以運作的程式碼加⼊入版本控制內
• 流程提醒:
- working directory > staging area > commit
單元總結
• 在這個單元裡我們學到了些什麼?
- tinker 的使⽤用⽅方式
- Laravel 的 ORM 慣例及資料表關聯設定
- 使⽤用 ORM 來操作資料庫內的資料
Q & A
歡迎提問討論

Contenu connexe

Tendances

管理資訊系統之資訊架構
管理資訊系統之資訊架構管理資訊系統之資訊架構
管理資訊系統之資訊架構5045033
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Composer 經典食譜
Composer 經典食譜Composer 經典食譜
Composer 經典食譜Shengyou Fan
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Introducing Modern Perl
Introducing Modern PerlIntroducing Modern Perl
Introducing Modern PerlDave Cross
 
SSRF基礎
SSRF基礎SSRF基礎
SSRF基礎Yu Iwama
 
Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定ServletJustin Lin
 
Java Collections
Java CollectionsJava Collections
Java Collectionsparag
 
Java - Collections framework
Java - Collections frameworkJava - Collections framework
Java - Collections frameworkRiccardo Cardin
 
Java Collection framework
Java Collection frameworkJava Collection framework
Java Collection frameworkankitgarg_er
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosDaniel Brandão
 

Tendances (20)

管理資訊系統之資訊架構
管理資訊系統之資訊架構管理資訊系統之資訊架構
管理資訊系統之資訊架構
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Composer 經典食譜
Composer 經典食譜Composer 經典食譜
Composer 經典食譜
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Introducing Modern Perl
Introducing Modern PerlIntroducing Modern Perl
Introducing Modern Perl
 
SSRF基礎
SSRF基礎SSRF基礎
SSRF基礎
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
 
Java Collections
Java CollectionsJava Collections
Java Collections
 
Java - Collections framework
Java - Collections frameworkJava - Collections framework
Java - Collections framework
 
POO - Aula 09 - Herança
POO - Aula 09 - HerançaPOO - Aula 09 - Herança
POO - Aula 09 - Herança
 
Java Collection framework
Java Collection frameworkJava Collection framework
Java Collection framework
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
 

En vedette

Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹Shengyou Fan
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合Shengyou Fan
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 

En vedette (20)

CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
 
使用者認證
使用者認證使用者認證
使用者認證
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
CRUD 綜合應用
CRUD 綜合應用CRUD 綜合應用
CRUD 綜合應用
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
課程簡介
課程簡介課程簡介
課程簡介
 

Similaire à Eloquent ORM

使用 Eloquent ORM
使用 Eloquent ORM使用 Eloquent ORM
使用 Eloquent ORMShengyou Fan
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作Shengyou Fan
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘Liu Allen
 
Django development
Django developmentDjango development
Django developmentloveyudu
 
Uc home二次开发参考手册
Uc home二次开发参考手册Uc home二次开发参考手册
Uc home二次开发参考手册charleenchen1990
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门Lucien Li
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學ilovejoomla
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejsChi-wen Sun
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212Asika Simon
 
Web scraping入門1
Web scraping入門1Web scraping入門1
Web scraping入門1兆欽 丘
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013modou li
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则YUCHENG HU
 

Similaire à Eloquent ORM (20)

Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
使用 Eloquent ORM
使用 Eloquent ORM使用 Eloquent ORM
使用 Eloquent ORM
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 
Django development
Django developmentDjango development
Django development
 
Uc home二次开发参考手册
Uc home二次开发参考手册Uc home二次开发参考手册
Uc home二次开发参考手册
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學【 I Love Joomla 】- Joomla!佈景製作教學
【 I Love Joomla 】- Joomla!佈景製作教學
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
ios分享
ios分享ios分享
ios分享
 
I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212I Love Joomla! 佈景製作教學 0212
I Love Joomla! 佈景製作教學 0212
 
Web scraping入門1
Web scraping入門1Web scraping入門1
Web scraping入門1
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则
 

Plus de 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
 
老派浪漫:用 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
 
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置Shengyou Fan
 

Plus de 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) 開發跨平台行動應用
 
老派浪漫:用 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
 
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
 

Eloquent ORM

  • 1. Eloquent ORM 范聖佑 Shengyou Fan 新北市樹林國⼩小 (2015/07/09) 適 ⽤用 5.1 版
  • 2. 單元主題 • 什麼是 ORM? • Laravel 的 ORM 慣例以及如何透過 ORM 對資料做新 增、查詢、更新、刪除等動作 • ORM 間如何設定欄位的關聯? • 什麼是 tinker 互動指令⼯工具?tinker 可以幫助我 們什麼? • 設定⼯工作坊專案所需的 ORM 關聯
  • 4. tinker 互動指令列 • PHP 本⾝身就有內建互動指令 (REPL) 模式,可以在這個 模式底下測試 PHP 程式碼,並⽴立即獲得回饋 - $  php  -­‐a • 從 Laravel 4.1 開始整合了 Boris,提供 tinker 互動指 令列功能,除了進⼊入 PHP 的 REPL 模式外,並加載 Laravel 所有物件環境,讓開發者可以在指令模式底下 測試 Laravel 程式碼 (Boris 相依於 pcntl 外掛,Windows 平台沒有實 作,因此 tinker 在 Windows 底下功能受限) • Laravel 5.0 則是將 Boris 更換為 psysh,除了讓 tinker 功能更多外,也讓 Windows 開發者有完全的功能
  • 5. $  [php]  artisan  tinker 進⼊入  tinker  互動指令列
  • 6. artisan  tinker • 進⼊入 PHP 互動 (REPL) 模式,並載⼊入 Laravel 環境 - 可以直接在指令模式下測試 PHP 程式碼,或是實驗 如何操作 Laravel 物件 - 可⽤用 exit 或⽤用 Ctrl-­‐C 結束 tinker 模式 • 範例: $  php  artisan  tinker   Psy  Shell  v0.4.4  (PHP  5.6.10  —  cli)  by  Justin  Hileman   >>>  echo  'Hello,  tinker!'   Hello,  tinker!   =>  null   >>>  exit   Exit:    Goodbye.
  • 7. tinker  畫⾯面 在 artisan tinker 底下測試 Laravel 程式
  • 8. dd() 測試⼯工具 • Laravel 內建的除錯函式 • 在 Laravel 4.2 版以前,dd() 其實就是把變數丟進 var_dump() 後 exit() • 在 Laravel 5.0 後,dd() 升級成呼叫 Symfony 的 VarDumper 元件,畫⾯面更好⽤用了! • 可以在任何地⽅方使⽤用,測試程式碼流程、邏輯、了 解物件內容 • 範例: $post  =  'Hello,  world!';   dd($post);
  • 9. 使⽤用  Eloquent  ORM ★ 參考⽂文件:http://laravel.com/docs/5.1/eloquent
  • 10. 什麼是 ORM? • Object-Relational Mapping • 在寫資料庫查詢時,往往需要組合 SQL 查詢式,除 了要⾃自⾏行處理字串跳脫等安全性防護機制外,也要 ⾃自⾏行轉換從資料庫取出的資料格式。當查詢式變⻑⾧長、 關聯⽇日趨複雜時,在撰寫對應的功能時會更為⾟辛苦 • ⽽而 ORM 則是依照慣例,把資料庫裡⼀一筆⼀一筆的資料 變成類似物件的概念來操作。這些物件透過繼承增 加了更多的⽅方法,讓資料庫的操作 (CRUD) 更加直 覺、⽅方便
  • 11. Laravel 的 ORM 慣例 • Laravel 的 Model/ORM 依照以下慣例: - ⼀一種資源 (resource) 對應到資料庫裡的⼀一個資料表 (table) - ⼀一個 Model 對應到資料表裡的⼀一列 (row) - 每⼀一個 Model 裡預設都要有⼀一個 auto-increment 的 id 做為 primary key,並預設有 created_at 及 updated_at 紀錄 Model 產⽣生及更新的時間戳記 - 資料表的名稱⽤用英⽂文複數、蛇底式命名;⽽而 Model 的名稱就⽤用英⽂文單數、⼤大駝峰式命名
  • 12. 查詢資料 • 取出全部資料 - Model::all() • ⽤用 primary key 取出單或數筆資料 - Model::find($id)、Model::find([/*  ids  */]) • 增加查詢條件式 - Model::where('欄位',  '條件',  '值') - Model::orderBy('欄位',  '排序⽅方式') • 串聯多個條件 - Model::where(/*略*/)-­‐>orderBy(/*略*/)-­‐>get()
  • 13. Collection 類別 • Laravel 實作了 Collection 類別,擴充了原有陣列 (array) 的功能,讓從資料表取出來的資料更好操作 • ⽤用 Eloquent 查詢取得的回傳物件就是 Collection,由 於其實作了數個 PHP 預先定義的介⾯面,包括: ArrayAccess、Arrayable、Countable、 IteratorAggregate、Jsonable、 JsonSerializable,所以可以直接當陣列使⽤用,或 是直接輸出成 JSON 格式
  • 14. Collection 的運⽤用⽅方式 • 透過 Model 查詢資料庫後,Laravel 會回傳⼀一個 Collection 物件,裡⾯面放了回傳資料的 Model ,其⾏行 為就像陣列⼀一樣,可以⽀支援⽤用 foreach 取出資料 • 若是⽤用於 API,也可直接轉成 JSON 輸出 $posts  =  AppPost::all();  //  $posts  是  Collection   foreach($posts  as  $post)   {          echo  $post-­‐>title;  //  $post  是  Model   } $posts  =  AppPost::all();   return  $posts-­‐>toJson();
  • 15. Helper 與 Facade • 平常也可以將陣列轉成 Collection 使⽤用,可以⽤用 collect() helper function 或 Collection Facade //  使⽤用  helper  function   $collection  =  collect([1,  2,  3]);   //  使⽤用  Facade   $collection  =  Collection::make([1,  2,  3]);
  • 16. 是 Model 還是 Collection? • 若是查詢回傳的是⼀一個資料集 (Recordset) 就是 Collection;若查詢回傳的是⼀一筆資料 (Row) 就是 Model //  Collection   $posts  =  AppPost::all();   $hotPosts  =  AppPost::where('is_feature',  1)-­‐>get();   //  Model   $post  =  AppPost::find($id);   $post  =  AppPost::orderBy(/*略*/)-­‐>first();  
  • 17. 新增資料 • 使⽤用 new 建構式 - 直接使⽤用 new 建構式產⽣生 Model 實體,再存檔 • 範例: $post  =  new  AppPost;   $post-­‐>title  =  'My  Post  Title';   $post-­‐>save();
  • 18. 新增資料 • 使⽤用 Facade 的 create ⽅方法 - 直接從陣列新增⼀一筆資料,陣列的 key 值⾃自動對應 到資料表的欄位 • 語法: - Model::create($array) • 範例: $post  =  AppPost::create([     'title'  =>  'My  Title',     'sub_title'  =>  'My  Sub  Title',     'content'  =>  'Post  Content',     'is_feature'  =>  true,   ]);
  • 19. Mass Assignment • Laravel 的 ORM 可以直接⽤用 Mass Assignment 的⽅方式 直接新增資料,透過陣列 key 值與資料表欄位名稱 的對應可以迅速的將資料寫⼊入資料庫內 • 這樣的作法雖然語法簡潔、快速⽅方便,但若使⽤用不 當可能會有安全性問題,⽐比⽅方說密碼欄位有可能因 此被覆寫 • 為了提升安全性,在 Model 裡預設將所有的欄位都 設定為不可使⽤用 Mass Assignment 做為防禦⼿手段。若 要使⽤用的話,則要設定 fillable 屬性將要使⽤用 Mass Assignment 的欄位打開
  • 21. 設定 fillable、guarded • 在 Model 內設定 fillable 屬性,指定哪些欄位可 以透過 Mass Assignment 來寫⼊入/更新資料 • guarded 則是相反的屬性,設定後可以保護特定欄 位不使⽤用 Mass Assignment • 範例: class  Post  extends  Model  {     protected  $fillable  =  [       'title',       'sub_title',       'content',       'is_feature'     ];     protected  $guarded  =  ['id',  'password'];   }
  • 22. 刪除資料 • 使⽤用 Model 的 delete ⽅方法 - 先取出 Model 實體後,再刪除 • 語法: - $model-­‐>delete() • 範例: $post  =  AppPost::find(1);   $post-­‐>delete();
  • 23. 刪除資料 • 使⽤用 Facade 的 destroy ⽅方法 - ⽤用 primary key 刪除對應的資料,可⽀支援多筆刪除 • 語法: - Model::destroy(/*  primary  key  */) • 範例: //  使⽤用  primary  key  刪除⼀一筆資料   AppPost::destroy(1);   //  使⽤用  array  刪除多筆資料   AppPost::destroy([1,  2,  3]);   //  使⽤用多參數傳值刪除多筆資料   AppPost::destroy(1,  2,  3);
  • 24. 更新資料 • 使⽤用 Model 的 update ⽅方法 - 先將資料庫取出 Model 實體,再從陣列更新資料, 陣列的 key 值⾃自動對應到資料表的欄位 • 語法: - $model-­‐>update($array) • 範例: $post  =  AppPost::find(1);   $post-­‐>update([     'title'  =>  'new  title',     'sub_title'  =>  'new  sub  title',     'content'  =>  'new  content',     'is_feature'  =>  false,   ]);
  • 25. 儲存資料 • 使⽤用 Model 的 save ⽅方法 - 先取出 Model 實體後,再針對屬性更新,全部完成 後再存檔 • 語法: - $model-­‐>save() • 範例: $post  =  AppPost::find(1);   $post-­‐>title  =  'My  New  Title';   $post-­‐>sub_title  =  'My  New  Sub  Title';   $post-­‐>content  =  'My  New  Content';   $post-­‐>is_feature  =  false;   $post-­‐>save();
  • 28. Model 關聯類型 • A 擁有多個 B - ⼀一對多 - 例:⼀一個 Post 有很多個 Comment - hasMany() • B 歸屬於 A - ⼀一對多反向 - 例:每個 Comment 都會屬於⼀一個 Post - belongsTo()
  • 29. 資料關聯設定 • 只要在 Model 內定義⾃自⼰己與其他 Model 間的關聯類 型,Laravel 就會⾃自動將這個關聯變成物件間的屬 性,在查詢時完全不需要⾃自⾏行下 SQL 語法 • 語法: • 範例: public  function  {另⼀一個  Model  的名稱(單/複數)}()   {          return  $this-­‐>{關聯類型}('{Model  名稱}');   } /*  app/Post.php  */   public  function  comments()   {          return  $this-­‐>hasMany('AppComment');   }
  • 30. 透過 Model 取得關聯資料 • 由於 ORM 已經把資料表的 row 變成⼀一個物件,row 裡的資料變成物件的屬性值,⽽而物件間的關聯也⼀一 樣是屬性值,透過這個屬性值就可以取得關聯後的 Model,再⽤用⼀一樣的⽅方式印出該 Model 的資料即可 • 範例: //  先取得  Post  實體   $post  =  AppPost::find(1);   echo  $post-­‐>title;   //  把  Post  的  Comment  印出來   foreach($post-­‐>comments  as  $comment)   {          //  $post-­‐>comments  是⼀一個  Collection          //  $comment  就是  Comment  Model          echo  $comment-­‐>content;   }
  • 33. 設定 Model、測試 Eloquent • 設定三個 Model 內的 fillable 屬性 • 設定 Post 及 Comment 兩個 Model 的資料關聯 • 在 php  artisan  tinker 裡測試 Eloquent 的使⽤用⽅方 式 • 在 app/Http/routes.php 裡測試 Eloquent 的使⽤用⽅方式 • 練習 dd() 的使⽤用⽅方式
  • 35. 單元總結 • 在這個單元裡我們學到了些什麼? - tinker 的使⽤用⽅方式 - Laravel 的 ORM 慣例及資料表關聯設定 - 使⽤用 ORM 來操作資料庫內的資料