Eloquent ORM
范聖佑 Shengyou Fan
臺中科⼤大資⼯工系 (2015/06/13)
適
⽤用
5.0
版
單元主題
• 什麼是 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.9	
  —	
  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
什麼是 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_hot',	
  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_hot'	
  =>	
  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_hot'	
  
	
   ];	
  
	
   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_hot'	
  =>	
  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_hot	
  =	
  false;	
  
$post-­‐>save();
資料表關聯
資料表間的關聯
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
歡迎提問討論

More Related Content

PDF
Eloquent ORM
PDF
Migrations 與 Schema 操作
PDF
Model & Seeding整合
PDF
Laravel - 系統全攻略
PDF
整合 Open ID
PDF
CRUD 綜合運用
PDF
Model 設定與 Seeding
PDF
Schema & Migration操作
Eloquent ORM
Migrations 與 Schema 操作
Model & Seeding整合
Laravel - 系統全攻略
整合 Open ID
CRUD 綜合運用
Model 設定與 Seeding
Schema & Migration操作

What's hot (20)

PDF
Migrations 與 Schema操作
PDF
View 與 Blade 樣板引擎
PDF
開發流程與工具介紹
PDF
使用 Eloquent ORM
PDF
使用 Controller
PDF
CRUD 綜合運用
PDF
Package 安裝與使用
PDF
Model 設定與 Seeding
PDF
驗證與訊息
PDF
開發環境建置
PDF
Route 路由控制
PDF
工作坊總結
PDF
Composer 套件管理
PDF
PHP 語法基礎與物件導向
PDF
View 與 Blade 樣板引擎
PDF
開發環境建置
PDF
Laravel - 系統全攻略(續)
PDF
驗證與訊息
PDF
View 與 Blade 樣板引擎
PDF
Route路由控制
Migrations 與 Schema操作
View 與 Blade 樣板引擎
開發流程與工具介紹
使用 Eloquent ORM
使用 Controller
CRUD 綜合運用
Package 安裝與使用
Model 設定與 Seeding
驗證與訊息
開發環境建置
Route 路由控制
工作坊總結
Composer 套件管理
PHP 語法基礎與物件導向
View 與 Blade 樣板引擎
開發環境建置
Laravel - 系統全攻略(續)
驗證與訊息
View 與 Blade 樣板引擎
Route路由控制
Ad

Viewers also liked (14)

PDF
應用程式部署
PDF
Package安裝與使用
PDF
專案啟動與環境設定
PDF
工作坊簡介
PDF
使用 Controller
PDF
開發環境建置
PDF
使用者認證
PDF
專案啟動與設定
PDF
CRUD 綜合應用
PDF
課程簡介
PDF
應用程式佈署
PDF
Route 機制
PDF
工作坊總結
PDF
使用者認證
應用程式部署
Package安裝與使用
專案啟動與環境設定
工作坊簡介
使用 Controller
開發環境建置
使用者認證
專案啟動與設定
CRUD 綜合應用
課程簡介
應用程式佈署
Route 機制
工作坊總結
使用者認證
Ad

Similar to Eloquent ORM (12)

PDF
Laradebut #5 - 關於 CRUD 外的一點小事
PDF
使用 laravel 的前與後
PDF
Introduction to CodeIgniter
PDF
Ksdg 使用 ruby on rails 快速打造你的 web app
PPTX
Laravel 5.2 教學
PDF
Laravel II - Developer Student Clubs NCU.pdf
PDF
[DCTPE2010] Drupal 模組開發入門
PDF
AngularJS training in Luster
PDF
給你一個使用 Laravel 的理由
PDF
Introduction to MVC of CodeIgniter 2.1.x
PDF
常見設計模式介紹
PPT
TWOHD_Wretch API
Laradebut #5 - 關於 CRUD 外的一點小事
使用 laravel 的前與後
Introduction to CodeIgniter
Ksdg 使用 ruby on rails 快速打造你的 web app
Laravel 5.2 教學
Laravel II - Developer Student Clubs NCU.pdf
[DCTPE2010] Drupal 模組開發入門
AngularJS training in Luster
給你一個使用 Laravel 的理由
Introduction to MVC of CodeIgniter 2.1.x
常見設計模式介紹
TWOHD_Wretch API

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

Eloquent ORM

  • 1. Eloquent ORM 范聖佑 Shengyou Fan 臺中科⼤大資⼯工系 (2015/06/13) 適 ⽤用 5.0 版
  • 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.9  —  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);
  • 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_hot',  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_hot'  =>  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_hot'     ];     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_hot'  =>  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_hot  =  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 來操作資料庫內的資料