ThinkPHP視圖查詢?cè)斀?/h1>
更新時(shí)間:2014年06月30日 15:51:29 投稿:shichen2014
這篇文章主要介紹了ThinkPHP視圖查詢,需要的朋友可以參考下
ThinkPHP提供的視圖查詢應(yīng)用功能十分強(qiáng)大,用戶利用視圖查詢功能可以將多個(gè)數(shù)據(jù)表的字段內(nèi)容按需要進(jìn)行指定和篩選,組織成一個(gè)基于這些數(shù)據(jù)表的視圖模型,然后就可以通過(guò)該模型直接進(jìn)行多表聯(lián)合查詢,非常方便和簡(jiǎn)單。
例如在項(xiàng)目中,我們定義有三個(gè)表:
user 用戶基礎(chǔ)表,
user_info 用戶詳細(xì)信息表,
dept 部門分類表
現(xiàn)在我們需要獲取某個(gè)用戶信息,
該信息要包括用戶的帳號(hào)名稱和相關(guān)資料與及所在部門的名稱,
這時(shí)候我們可以利用視圖查詢進(jìn)行處理。
下面舉例加以說(shuō)明:
1.構(gòu)建一個(gè)新項(xiàng)目并進(jìn)行相關(guān)配置(可參考前面的教程,這里省略)
2.創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)tpview,并添加這三個(gè)表
(1) 用戶表
CREATE TABLE `think_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID編號(hào)',
`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='會(huì)員表' 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 '詳細(xì)地址',
`gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性別',
`mobile` varchar(100) NOT NULL COMMENT '手機(jī)號(hào)碼',
`telephone` varchar(100) NOT NULL COMMENT '電話號(hào)碼',
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, '國(guó)', 'zzguo28@163.com', 'TP路think街1.6號(hào)', 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, '財(cái)務(wù)部');
3.在項(xiàng)目/Lib/Model下創(chuàng)建這三個(gè)表的基礎(chǔ)模型Model
本示例沒涉及到驗(yàn)證等其它功能,所以只要簡(jiǎn)單定義測(cè)可,例如
<?php
class UserModel extends Model {
}
?>
其實(shí)視圖模型對(duì)應(yīng)的數(shù)據(jù)表并非一定要有相應(yīng)的的基礎(chǔ)模型,但是建議您創(chuàng)建,這樣單表和視圖都可以操作。
4.創(chuàng)建視圖模型,代碼如下,詳細(xì)注解見其后:
(附注:最新svn上已增加動(dòng)態(tài)擴(kuò)展模型功能,使用新版需要將protected屬性改為public屬性,建議使用動(dòng)態(tài)擴(kuò)展功能去使用視圖查詢,而不再是本教程的繼承方式。那樣使用會(huì)更靈活。)
<?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'),
);
}
?>
對(duì)上述代碼解釋如下:
在第2行代碼中,由于自TP1.6版開始已將視圖查詢分離出原Model類,因此這里需要使用import方法引入了視圖模型類。
第3行代碼中,定義了該模型名稱為UserViewModel,視圖模型的名稱Model前的命名是隨意的,只是為了有別于其它模型,通常我們會(huì)以xxxViewModel這樣的方式去命名。并且一定要繼承ViewModel。(ThinkPHP1.6版無(wú)需再設(shè)置模型的viewModel屬性為true,只要繼承ViewModel則可)
第4行代碼$viewFields 屬性表示視圖模型包含的字段,每個(gè)元素定義了各個(gè)數(shù)據(jù)表或者模型所需的字段。
格式是
protected $viewFields = array(
'表名'=>array('所需字段','_as'=>'別名定義','_on'=>'篩選條件','_type'=>'指定join類型,支持right,inner,left三種'),
);
注意到第7行代碼中的'name'=>'dept',因?yàn)閁ser模型里面已經(jīng)存在了一個(gè)name字段,所以我們通過(guò)這種方式把Dept模型的name字段映射為dept字段,如果有多個(gè)字段,可以使用同樣的方式添加。
定義完畢后,我們?cè)贏ction中進(jìn)行測(cè)試,代碼如下
<?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等等。
您可能感興趣的文章:- Thinkphp5.0框架視圖view的模板布局用法分析
- Thinkphp5.0 框架視圖view的比較標(biāo)簽用法分析
- Thinkphp5.0框架視圖view的循環(huán)標(biāo)簽用法示例
- Thinkphp5.0 框架實(shí)現(xiàn)控制器向視圖view賦值及視圖view取值操作示例
- Thinkphp5框架實(shí)現(xiàn)獲取數(shù)據(jù)庫(kù)數(shù)據(jù)到視圖的方法
- thinkphp視圖模型查詢提示ERR: 1146:Table ''db.pr_order_view'' doesn''t exist的解決方法
- thinkphp3.2框架中where條件查詢用法總結(jié)
- 基于thinkPHP3.2實(shí)現(xiàn)微信接入及查詢token值的方法
- 分享ThinkPHP3.2中關(guān)聯(lián)查詢解決思路
- thinkphp 3.2框架視圖模型 實(shí)例視圖查詢結(jié)果的二維數(shù)組合并操作示例
相關(guān)文章
-
PHP OPP機(jī)制和模式簡(jiǎn)介(抽象類、接口和契約式編程)
本文將介紹抽象類、接口和一種稱為契約式編程的技術(shù)。使用這些OPP機(jī)制,所編寫的代碼就不限于只能計(jì)算或者輸出內(nèi)容了。這些機(jī)制能夠在概念層次上定義類之間交互作用的規(guī)則,也為應(yīng)用程序的擴(kuò)展和定制提供了基礎(chǔ)。 2014-06-06
-
PHP創(chuàng)建PowerPoint2007文檔的方法
這篇文章主要介紹了PHP創(chuàng)建PowerPoint2007文檔的方法,通過(guò)PHP第三方插件PHPPowerPoint類庫(kù)實(shí)現(xiàn)ppt文件的生成功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下 2015-12-12
-
適用于抽獎(jiǎng)程序、隨機(jī)廣告的PHP概率算法實(shí)例
做網(wǎng)站類的有時(shí)會(huì)弄個(gè)活動(dòng)什么的,來(lái)讓用戶參加,既吸引用戶注冊(cè),又提高網(wǎng)站的用戶活躍度。同時(shí)參加的用戶會(huì)獲得一定的獎(jiǎng)品,有100%中獎(jiǎng)的,也有按一定概率中獎(jiǎng)的,大的比如中個(gè)ipad、iphone5,小的中個(gè)Q幣什么的 2014-04-04
-
一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)密碼登陸php代碼
密碼對(duì),就可以看到指定內(nèi)容, 密碼不對(duì)就進(jìn)不去 2012-07-07
-
解決PHP使用CURL發(fā)送GET請(qǐng)求時(shí)傳遞參數(shù)的問題
今天小編就為大家分享一篇解決PHP使用CURL發(fā)送GET請(qǐng)求時(shí)傳遞參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 2019-10-10
-
詳解yii2實(shí)現(xiàn)分庫(kù)分表的方案與思路
這篇文章主要介紹了利用yii2實(shí)現(xiàn)分庫(kù)分表的方案與思路,在研究yii2如何分庫(kù)分表之前,我先對(duì)yii2的核心概念和框架結(jié)構(gòu)做了一個(gè)初步的探索,從而找到分庫(kù)分表的思路。有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。 2017-02-02
-
一個(gè)簡(jiǎn)單安全的PHP驗(yàn)證碼類、PHP驗(yàn)證碼
這篇文章主要介紹了一個(gè)簡(jiǎn)單安全的PHP驗(yàn)證碼類 PHP驗(yàn)證碼的相關(guān)資料,需要的朋友可以參考下 2016-09-09
-
Thinkphp5.0框架使用模型Model的獲取器、修改器、軟刪除數(shù)據(jù)操作示例
這篇文章主要介紹了Thinkphp5.0框架使用模型Model的獲取器、修改器、軟刪除數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了thinkPHP5.0模型Model獲取器、修改器數(shù)據(jù)操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下 2019-10-10
最新評(píng)論
ThinkPHP提供的視圖查詢應(yīng)用功能十分強(qiáng)大,用戶利用視圖查詢功能可以將多個(gè)數(shù)據(jù)表的字段內(nèi)容按需要進(jìn)行指定和篩選,組織成一個(gè)基于這些數(shù)據(jù)表的視圖模型,然后就可以通過(guò)該模型直接進(jìn)行多表聯(lián)合查詢,非常方便和簡(jiǎn)單。
例如在項(xiàng)目中,我們定義有三個(gè)表:
user 用戶基礎(chǔ)表,
user_info 用戶詳細(xì)信息表,
dept 部門分類表
現(xiàn)在我們需要獲取某個(gè)用戶信息,
該信息要包括用戶的帳號(hào)名稱和相關(guān)資料與及所在部門的名稱,
這時(shí)候我們可以利用視圖查詢進(jìn)行處理。
下面舉例加以說(shuō)明:
1.構(gòu)建一個(gè)新項(xiàng)目并進(jìn)行相關(guān)配置(可參考前面的教程,這里省略)
2.創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)tpview,并添加這三個(gè)表
(1) 用戶表
CREATE TABLE `think_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID編號(hào)', `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='會(huì)員表' 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 '詳細(xì)地址', `gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性別', `mobile` varchar(100) NOT NULL COMMENT '手機(jī)號(hào)碼', `telephone` varchar(100) NOT NULL COMMENT '電話號(hào)碼', 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, '國(guó)', 'zzguo28@163.com', 'TP路think街1.6號(hào)', 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, '財(cái)務(wù)部');
3.在項(xiàng)目/Lib/Model下創(chuàng)建這三個(gè)表的基礎(chǔ)模型Model
本示例沒涉及到驗(yàn)證等其它功能,所以只要簡(jiǎn)單定義測(cè)可,例如
<?php class UserModel extends Model { } ?>
其實(shí)視圖模型對(duì)應(yīng)的數(shù)據(jù)表并非一定要有相應(yīng)的的基礎(chǔ)模型,但是建議您創(chuàng)建,這樣單表和視圖都可以操作。
4.創(chuàng)建視圖模型,代碼如下,詳細(xì)注解見其后:
(附注:最新svn上已增加動(dòng)態(tài)擴(kuò)展模型功能,使用新版需要將protected屬性改為public屬性,建議使用動(dòng)態(tài)擴(kuò)展功能去使用視圖查詢,而不再是本教程的繼承方式。那樣使用會(huì)更靈活。)
<?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'), ); } ?>
對(duì)上述代碼解釋如下:
在第2行代碼中,由于自TP1.6版開始已將視圖查詢分離出原Model類,因此這里需要使用import方法引入了視圖模型類。
第3行代碼中,定義了該模型名稱為UserViewModel,視圖模型的名稱Model前的命名是隨意的,只是為了有別于其它模型,通常我們會(huì)以xxxViewModel這樣的方式去命名。并且一定要繼承ViewModel。(ThinkPHP1.6版無(wú)需再設(shè)置模型的viewModel屬性為true,只要繼承ViewModel則可)
第4行代碼$viewFields 屬性表示視圖模型包含的字段,每個(gè)元素定義了各個(gè)數(shù)據(jù)表或者模型所需的字段。
格式是
protected $viewFields = array( '表名'=>array('所需字段','_as'=>'別名定義','_on'=>'篩選條件','_type'=>'指定join類型,支持right,inner,left三種'), );
注意到第7行代碼中的'name'=>'dept',因?yàn)閁ser模型里面已經(jīng)存在了一個(gè)name字段,所以我們通過(guò)這種方式把Dept模型的name字段映射為dept字段,如果有多個(gè)字段,可以使用同樣的方式添加。
定義完畢后,我們?cè)贏ction中進(jìn)行測(cè)試,代碼如下
<?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等等。
- Thinkphp5.0框架視圖view的模板布局用法分析
- Thinkphp5.0 框架視圖view的比較標(biāo)簽用法分析
- Thinkphp5.0框架視圖view的循環(huán)標(biāo)簽用法示例
- Thinkphp5.0 框架實(shí)現(xiàn)控制器向視圖view賦值及視圖view取值操作示例
- Thinkphp5框架實(shí)現(xiàn)獲取數(shù)據(jù)庫(kù)數(shù)據(jù)到視圖的方法
- thinkphp視圖模型查詢提示ERR: 1146:Table ''db.pr_order_view'' doesn''t exist的解決方法
- thinkphp3.2框架中where條件查詢用法總結(jié)
- 基于thinkPHP3.2實(shí)現(xiàn)微信接入及查詢token值的方法
- 分享ThinkPHP3.2中關(guān)聯(lián)查詢解決思路
- thinkphp 3.2框架視圖模型 實(shí)例視圖查詢結(jié)果的二維數(shù)組合并操作示例
相關(guān)文章
PHP OPP機(jī)制和模式簡(jiǎn)介(抽象類、接口和契約式編程)
本文將介紹抽象類、接口和一種稱為契約式編程的技術(shù)。使用這些OPP機(jī)制,所編寫的代碼就不限于只能計(jì)算或者輸出內(nèi)容了。這些機(jī)制能夠在概念層次上定義類之間交互作用的規(guī)則,也為應(yīng)用程序的擴(kuò)展和定制提供了基礎(chǔ)。2014-06-06PHP創(chuàng)建PowerPoint2007文檔的方法
這篇文章主要介紹了PHP創(chuàng)建PowerPoint2007文檔的方法,通過(guò)PHP第三方插件PHPPowerPoint類庫(kù)實(shí)現(xiàn)ppt文件的生成功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-12-12適用于抽獎(jiǎng)程序、隨機(jī)廣告的PHP概率算法實(shí)例
做網(wǎng)站類的有時(shí)會(huì)弄個(gè)活動(dòng)什么的,來(lái)讓用戶參加,既吸引用戶注冊(cè),又提高網(wǎng)站的用戶活躍度。同時(shí)參加的用戶會(huì)獲得一定的獎(jiǎng)品,有100%中獎(jiǎng)的,也有按一定概率中獎(jiǎng)的,大的比如中個(gè)ipad、iphone5,小的中個(gè)Q幣什么的2014-04-04一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)密碼登陸php代碼
密碼對(duì),就可以看到指定內(nèi)容, 密碼不對(duì)就進(jìn)不去2012-07-07解決PHP使用CURL發(fā)送GET請(qǐng)求時(shí)傳遞參數(shù)的問題
今天小編就為大家分享一篇解決PHP使用CURL發(fā)送GET請(qǐng)求時(shí)傳遞參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10詳解yii2實(shí)現(xiàn)分庫(kù)分表的方案與思路
這篇文章主要介紹了利用yii2實(shí)現(xiàn)分庫(kù)分表的方案與思路,在研究yii2如何分庫(kù)分表之前,我先對(duì)yii2的核心概念和框架結(jié)構(gòu)做了一個(gè)初步的探索,從而找到分庫(kù)分表的思路。有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02一個(gè)簡(jiǎn)單安全的PHP驗(yàn)證碼類、PHP驗(yàn)證碼
這篇文章主要介紹了一個(gè)簡(jiǎn)單安全的PHP驗(yàn)證碼類 PHP驗(yàn)證碼的相關(guān)資料,需要的朋友可以參考下2016-09-09Thinkphp5.0框架使用模型Model的獲取器、修改器、軟刪除數(shù)據(jù)操作示例
這篇文章主要介紹了Thinkphp5.0框架使用模型Model的獲取器、修改器、軟刪除數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了thinkPHP5.0模型Model獲取器、修改器數(shù)據(jù)操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2019-10-10