WIKI使用導(dǎo)航
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢(qián)
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營(yíng)銷
- 虛擬主機(jī)管理系統(tǒng)
- 開(kāi)放平臺(tái)
- WIKI程序與應(yīng)用
- 美國(guó)十大主機(jī)
ThinkPHP開(kāi)發(fā)指南-模型之視圖模型
導(dǎo)航:上一頁(yè)
- 視圖定義
視圖通常是指數(shù)據(jù)庫(kù)的視圖,視圖是一個(gè)虛擬表,其內(nèi)容由查詢定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫(kù)中以存儲(chǔ)的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來(lái)自由定義視圖的查詢所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。對(duì)其中所引用的基礎(chǔ)表來(lái)說(shuō),視圖的作用類似于篩選。定義視圖的篩選可以來(lái)自當(dāng)前或其它數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)表,或者其它視圖。分布式查詢也可用于定義使用多個(gè)異類源數(shù)據(jù)的視圖。如果有幾臺(tái)不同的服務(wù)器分別存儲(chǔ)組織中不同地區(qū)的數(shù)據(jù),而您需要將這些服務(wù)器上相似結(jié)構(gòu)的數(shù)據(jù)組合起來(lái),這種方式就很有用。
視圖在有些數(shù)據(jù)庫(kù)下面并不被支持,但是ThinkPHP模擬實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的視圖,該功能可以用于多表聯(lián)合查詢。非常適合解決HAS_ONE 和 BELONGS_TO 類型的關(guān)聯(lián)查詢。要定義視圖模型,只需要繼承ViewModel,然后設(shè)置viewFields屬性即可。例如下面的例子,我們定義了一個(gè)BlogView模型對(duì)象,其中包括了Blog模型的id、name、title和User模型的name,以及Category模型的title字段,我們通過(guò)創(chuàng)建BlogView模型來(lái)快速讀取一個(gè)包含了User名稱和類別名稱的Blog記錄(集)。
PHP代碼
class BlogViewModel extends ViewModel { public $viewFields = array( 'Blog'=>array('id','name','title'), 'Category'=>array('title'=>'category_name', '_on'=>'Blog.category_id=Category.id'), 'User'=>array('name'=>'username', '_on'=>'Blog.user_id=User.id'), ); }
我們來(lái)解釋一下定義的格式代表了什么。$viewFields 屬性表示視圖模型包含的字段,每個(gè)元素定義了某個(gè)數(shù)據(jù)表或者模型的字段。例如:
PHP代碼
'Blog'=>array('id','name','title')
表示BlogView視圖模型要包含Blog模型中的id、name和title字段屬性,這個(gè)其實(shí)很容易理解,就和數(shù)據(jù)庫(kù)的視圖要包含某個(gè)數(shù)據(jù)表的字段一樣。而B(niǎo)log相當(dāng)于是給Blog模型對(duì)應(yīng)的數(shù)據(jù)表定義了一個(gè)別名。如果希望給blog表定義另外的別名,可以使用
PHP代碼
'_as'=>'myBlog'
BlogView視圖模式除了包含Blog模型之外,還包含了Category和User模型,下面的定義:
PHP代碼
'Category'=>array('title'=>'category_name')
和上面類似,表示BlogView視圖模型還要包含Category模型的title字段,因?yàn)橐晥D模型里面已經(jīng)存在了一個(gè)title字段,所以我們通過(guò)
PHP代碼
'title'=>'category_name'
把Category模型的title字段映射為category_name字段,如果有多個(gè)字段,可以使用同樣的方式添加??梢酝ㄟ^(guò)_on來(lái)給視圖模型定義關(guān)聯(lián)查詢條件,例如:
PHP代碼
'_on'=>'Blog.category_id=Category.id'
理解之后,User模型的定義方式同樣也就很容易理解了。
PHP代碼
Blog.categoryId = Category.id AND Blog.userId = User.id
最后,我們把視圖模型的定義翻譯成SQL語(yǔ)句就更加容易理解視圖模型的原理了。假設(shè)我們不帶任何其他條件查詢?nèi)康淖侄?,那么查詢的SQL語(yǔ)句就是
PHP代碼
Select Blog.id as id, Blog.name as name, Blog.title as title, Category.title as category_name, User.name as username from think_blog Blog JOIN think_category Category JOIN think_user User where Blog.category_id=Category.id AND Blog.user_id=User.id
視圖模型的定義并不需要先單獨(dú)定義其中的模型類,系統(tǒng)會(huì)默認(rèn)按照系統(tǒng)的規(guī)則進(jìn)行數(shù)據(jù)表的定位。如果Blog模型并沒(méi)有定義,那么系統(tǒng)會(huì)自動(dòng)根據(jù)當(dāng)前模型的表前綴和后綴來(lái)自動(dòng)獲取對(duì)應(yīng)的數(shù)據(jù)表。也就是說(shuō),如果我們并沒(méi)有定義Blog模型類,那么上面的定義后,系統(tǒng)在進(jìn)行視圖模型的操作的時(shí)候會(huì)根據(jù)Blog這個(gè)名稱和當(dāng)前的表前綴設(shè)置(假設(shè)為T(mén)hink_ )獲取到對(duì)應(yīng)的數(shù)據(jù)表可能是think_blog。
ThinkPHP還可以支持視圖模型的JOIN類型定義,我們可以把上面的視圖定義改成:
PHP代碼
public $viewFields = array( 'Blog'=>array('id','name','title','_type'=>'LEFT'), 'Category'=>array('title'=>'category_name','_on'=>'Category.id=Blog.category_id','_type'=>'RIGHT'), 'User'=>array('name'=>'username','_on'=>'User.id=Blog.user_id'), );
需要注意的是,這里的_type定義對(duì)下一個(gè)表有效,因此要注意視圖模型的定義順序。Blog模型的
PHP代碼
'_type'=>'LEFT'
針對(duì)的是下一個(gè)模型Category而言,通過(guò)上面的定義,我們?cè)诓樵兊臅r(shí)候最終生成的SQL語(yǔ)句就變成:
SQL代碼
Select Blog.id as id, Blog.name as name, Blog.title as title, Category.title as category_name, User.name as username from think_blog Blog LEFT JOIN think_category Category ON Blog.category_id=Category.id RIGHT JOIN think_user User ON Blog.user_id=User.id
我們可以在試圖模型里面定義特殊的字段,例如下面的例子定義了一個(gè)統(tǒng)計(jì)字段
PHP代碼
'Category'=>array('title'=>'category_name','COUNT(Blog.id)'=>'count','_on'=>'Category.id=Blog.category_id'),