SlideShare a Scribd company logo
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

What's hot

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

What's hot (20)

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

Viewers also liked

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

Viewers also liked (14)

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

Similar to Eloquent ORM

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
 
Uc home二次开发参考手册
Uc home二次开发参考手册Uc home二次开发参考手册
Uc home二次开发参考手册charleenchen1990
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
Bo-Yi Wu
 
课题一: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
 
【 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 requirejs
Chi-wen Sun
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则
YUCHENG HU
 
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兆欽 丘
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍cyf5513
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後
Shengyou Fan
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013
modou li
 
Zencart网站模板复制过程
Zencart网站模板复制过程Zencart网站模板复制过程
Zencart网站模板复制过程xiaochenlbm
 
PHP
PHPPHP
PHP
Ht Wang
 
Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式Chris Wu
 

Similar to Eloquent ORM (20)

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基础入门
 
Uc home二次开发参考手册
Uc home二次开发参考手册Uc home二次开发参考手册
Uc home二次开发参考手册
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 
Django development
Django developmentDjango development
Django development
 
ios分享
ios分享ios分享
ios分享
 
【 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
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则
 
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
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後
 
Uliweb比较与实践 2013
Uliweb比较与实践 2013Uliweb比较与实践 2013
Uliweb比较与实践 2013
 
Sun java
Sun javaSun java
Sun java
 
Zencart网站模板复制过程
Zencart网站模板复制过程Zencart网站模板复制过程
Zencart网站模板复制过程
 
PHP
PHPPHP
PHP
 
Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式
 

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 2023
Shengyou 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 Database
Shengyou 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 Multiplatform
Shengyou 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 Aggregator
Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
Shengyou 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
 

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 來操作資料庫內的資料