ThinkPHP視圖查詢

來源:互聯網
上載者:User
這篇文章主要介紹了ThinkPHP視圖查詢,需要的朋友可以參考下

ThinkPHP提供的視圖查詢應用功能十分強大,使用者利用視圖查詢功能可以將多個資料表的欄位內容按需要進行指定和篩選,組織成一個基於這些資料表的視圖模型,然後就可以通過該模型直接進行多表聯集查詢,非常方便和簡單。

例如在項目中,我們定義有三個表:

user 使用者基礎資料表,
user_info 使用者詳細資料表,
dept 部門分類表

現在我們需要擷取某個使用者資訊,
該資訊要包括使用者的帳號名稱和相關資料與及所在部門的名稱,
這時候我們可以利用視圖查詢進行處理。

下面舉例加以說明:

1.構建一個新項目並進行相關配置(可參考前面的教程,這裡省略)
2.建立一個資料庫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 '開放狀態', 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, '開發部'),(2, '銷售部'),(3, '財務部');

3.在項目/Lib/Model下建立這三個表的基本模型Model
本樣本沒涉及到驗證等其它功能,所以只要簡單定義測可,例如

 <?php  class UserModel extends Model {  } ?>

其實視圖模型對應的資料表並非一定要有相應的的基本模型,但是建議您建立,這樣單表和視圖都可以操作。

4.建立視圖模型,代碼如下,詳細註解見其後:

(附註:最新svn上已增加動態擴充模型功能,使用新版需要將protected屬性改為public屬性,建議使用動態擴充功能去使用視圖查詢,而不再是本教程的繼承方式。那樣使用會更靈活。)

<?phpimport('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版無需再設定模型的viewModel屬性為true,只要繼承ViewModel則可)

第4行代碼$viewFields 屬性工作表示視圖模型包含的欄位,每個元素定義了各個資料表或者模型所需的欄位。
格式是

protected $viewFields = array(    '表名'=>array('所需欄位','_as'=>'別名定義','_on'=>'篩選條件','_type'=>'指定join類型,支援right,inner,left三種'),);

注意到第7行代碼中的'name'=>'dept',因為User模型裡面已經存在了一個name欄位,所以我們通過這種方式把Dept模型的name欄位對應為dept欄位,如果有多個欄位,可以使用同樣的方式添加。

定義完畢後,我們在Action中進行測試,代碼如下

<?phpclass IndexAction extends Action{  public function index(){    $dao = D('UserView');    $where['u.id'] = 1;    dump($dao->where($where)->find());    dump($dao->getLastSql());  }}?>

然後訪問該操作,可以看到我們成功取得所需的查詢內容:

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等等。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.