首頁 >後端開發 >php教程 >ThinkPHP視圖查詢

ThinkPHP視圖查詢

不言
不言原創
2018-06-06 15:05:461836瀏覽

這篇文章主要介紹了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屬性,建議使用動態擴充功能去使用視圖查詢,而不再是本教學的繼承方式。那樣使用會更靈活。)

<?php
import(&#39;ViewModel&#39;);
class UserViewModel extends ViewModel{
  protected $viewFields = array(
    &#39;User&#39;   =>array(&#39;id&#39;,&#39;name&#39;,&#39;_as&#39;=>&#39;u&#39;,&#39;_type&#39;=>&#39;left&#39;),
    &#39;UserInfo&#39; =>array(&#39;email&#39;,&#39;mobile&#39;,&#39;_as&#39;=>&#39;ui&#39;,&#39;_on&#39;=>&#39;ui.user_id=u.id&#39;),
    &#39;Dept&#39;   =>array(&#39;name&#39;=>&#39;dept&#39;,&#39;_on&#39;=>&#39;u.dept_id=Dept.id&#39;),
  );
}
?>

對上述程式碼解釋如下:

在第2行程式碼中,由於自TP1.6版開始已將視圖查詢分離出原Model類,因此這裡需要使用import方法引入了視圖模型類別。

第3行程式碼中,定義了該模型名稱為UserViewModel,視圖模型的名稱Model前的命名是隨意的,只是為了有別於其它模型,通常我們會以xxxViewModel這樣的方式去命名。並且一定要繼承ViewModel。 (ThinkPHP1.6版無需再設定模型的viewModel屬性為true,只要繼承ViewModel則可)

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

格式是

protected $viewFields = array(
    &#39;表名&#39;=>array(&#39;所需字段&#39;,&#39;_as&#39;=>&#39;别名定义&#39;,&#39;_on&#39;=>&#39;筛选条件&#39;,&#39;_type&#39;=>&#39;指定join类型,支持right,inner,left三种&#39;),
);

注意到第7行程式碼中的'name'=>'dept',因為User模型裡面已經存在了一個name字段,所以我們透過這個方式把Dept模型的name字段映射為dept字段,如果有多個字段,可以使用相同的方式添加。

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

<?php
class IndexAction extends Action{
  public function index(){
    $dao = D(&#39;UserView&#39;);
    $where[&#39;u.id&#39;] = 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等等。 相關推薦:

ThinkPHP中的行為擴充與外掛程式


ThinkPHP實作更新資料實例詳解(demo)

#

以上是ThinkPHP視圖查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn