您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“ThinkPHP視圖查詢的方法”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
ThinkPHP提供的視圖查詢應(yīng)用功能十分強大,用戶利用視圖查詢功能可以將多個數(shù)據(jù)表的字段內(nèi)容按需要進行指定和篩選,組織成一個基于這些數(shù)據(jù)表的視圖模型,然后就可以通過該模型直接進行多表聯(lián)合查詢,非常方便和簡單。
例如在項目中,我們定義有三個表:
user 用戶基礎(chǔ)表,
user_info 用戶詳細信息表,
dept 部門分類表
現(xiàn)在我們需要獲取某個用戶信息,
該信息要包括用戶的帳號名稱和相關(guān)資料與及所在部門的名稱,
這時候我們可以利用視圖查詢進行處理。
下面舉例加以說明:
1.構(gòu)建一個新項目并進行相關(guān)配置(可參考前面的教程,這里省略)
2.創(chuàng)建一個數(shù)據(jù)庫tpview,并添加這三個表
(1) 用戶表
CREATE TABLE `think_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID編號', `name` varchar(20) NOT NULL COMMENT '帳戶', `password` varchar(32) NOT NULL COMMENT '密碼', `dept_id` smallint(6) unsigned NOT NULL, `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '開放狀態(tài)', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='會員表' AUTO_INCREMENT=2 ; INSERT INTO `think_user` (`id`, `name`, `password`, `dept_id`, `status`) VALUES (1, 'zzguo28', '123456', 2, 1);
(2)用戶信息表
CREATE TABLE `think_user_info` ( `user_id` int(11) NOT NULL COMMENT '用戶id', `nick_name` varchar(30) NOT NULL COMMENT '用戶昵稱', `email` varchar(100) NOT NULL COMMENT '郵箱地址', `address` varchar(100) NOT NULL COMMENT '詳細地址', `gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性別', `mobile` varchar(100) NOT NULL COMMENT '手機號碼', `telephone` varchar(100) NOT NULL COMMENT '電話號碼', KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用戶信息表'; INSERT INTO `think_user_info` (`user_id`, `nick_name`, `email`, `address`, `gender`, `mobile`, `telephone`) VALUES (1, '國', 'zzguo28@163.com', 'TP路think街1.6號', 1, '12345678901', '123456');
(3) 部門分類表
CREATE TABLE `think_dept` ( `id` smallint(3) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; INSERT INTO `think_dept` (`id`, `name`) VALUES (1, '開發(fā)部'), (2, '銷售部'), (3, '財務(wù)部');
3.在項目/Lib/Model下創(chuàng)建這三個表的基礎(chǔ)模型Model
本示例沒涉及到驗證等其它功能,所以只要簡單定義測可,例如
<?php class UserModel extends Model { } ?>
其實視圖模型對應(yīng)的數(shù)據(jù)表并非一定要有相應(yīng)的的基礎(chǔ)模型,但是建議您創(chuàng)建,這樣單表和視圖都可以操作。
4.創(chuàng)建視圖模型,代碼如下,詳細注解見其后:
(附注:最新svn上已增加動態(tài)擴展模型功能,使用新版需要將protected屬性改為public屬性,建議使用動態(tài)擴展功能去使用視圖查詢,而不再是本教程的繼承方式。那樣使用會更靈活。)
<?php import('ViewModel'); class UserViewModel extends ViewModel{ protected $viewFields = array( 'User' =>array('id','name','_as'=>'u','_type'=>'left'), 'UserInfo' =>array('email','mobile','_as'=>'ui','_on'=>'ui.user_id=u.id'), 'Dept' =>array('name'=>'dept','_on'=>'u.dept_id=Dept.id'), ); } ?>
對上述代碼解釋如下:
在第2行代碼中,由于自TP1.6版開始已將視圖查詢分離出原Model類,因此這里需要使用import方法引入了視圖模型類。
第3行代碼中,定義了該模型名稱為UserViewModel,視圖模型的名稱Model前的命名是隨意的,只是為了有別于其它模型,通常我們會以xxxViewModel這樣的方式去命名。并且一定要繼承ViewModel。(ThinkPHP1.6版無需再設(shè)置模型的viewModel屬性為true,只要繼承ViewModel則可)
第4行代碼$viewFields 屬性表示視圖模型包含的字段,每個元素定義了各個數(shù)據(jù)表或者模型所需的字段。
格式是
protected $viewFields = array( '表名'=>array('所需字段','_as'=>'別名定義','_on'=>'篩選條件','_type'=>'指定join類型,支持right,inner,left三種'), );
注意到第7行代碼中的'name'=>'dept',因為User模型里面已經(jīng)存在了一個name字段,所以我們通過這種方式把Dept模型的name字段映射為dept字段,如果有多個字段,可以使用同樣的方式添加。
定義完畢后,我們在Action中進行測試,代碼如下
<?php class IndexAction extends Action{ public function index(){ $dao = D('UserView'); $where['u.id'] = 1; dump($dao->where($where)->find()); dump($dao->getLastSql()); } } ?>
然后訪問該操作,可以看到我們成功取得所需的查詢內(nèi)容:
array(1) { [0] => array(5) { ["id"] => string(1) "1" ["name"] => string(7) "zzguo28" ["email"] => string(17) "zzguo28@163.com" ["mobile"] => string(11) "12345678901" ["dept"] => string(9) "銷售部" } }
并可以看到使用的sql如下
"SELECT u.id AS id,u.name AS name,ui.email AS email,ui.mobile AS mobile,Dept.name AS dept FROM think_user u LEFT JOIN think_user_info ui ON ui.user_id=u.id JOIN think_dept Dept ON u.dept_id=Dept.id WHERE ( u.id = 1 ) LIMIT 1 "
視圖模型在查詢上和普通單表并沒有多大分別,可以使用我們所熟悉的各種連貫操作,例如order,limit等等。
“ThinkPHP視圖查詢的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。