(1)配置數據庫鏈接php
數據庫的鏈接配置能夠在系統配置文件ThinkPHP/Conf/convention.php中找到html
/* 數據庫設置 */ 'DB_TYPE' => '', // 數據庫類型,通常爲MySQL 'DB_HOST' => '', // 服務器地址,本地開發時爲localhost,遠程爲遠程ip 'DB_NAME' => '', // 數據庫名 'DB_USER' => '', // 用戶名 'DB_PWD' => '', // 密碼 'DB_PORT' => '', // 端口,3306.若是填寫了MySQL,能夠不填 'DB_PREFIX' => '', // 數據庫表前綴。例如sp_user,前綴爲sp。至於緣由在文章裏作了介紹 'DB_PARAMS' => array(), // 數據庫鏈接參數 'DB_DEBUG' => TRUE, // 數據庫調試模式 開啓後能夠記錄SQL日誌 'DB_FIELDS_CACHE' => true, // 啓用字段緩存 'DB_CHARSET' => 'utf8', // 數據庫編碼默認採用utf8 'DB_DEPLOY_TYPE' => 0, // 數據庫部署方式:0 集中式(單一服務器),1 分佈式(主從服務器) 'DB_RW_SEPARATE' => false, // 數據庫讀寫是否分離 主從式有效 'DB_MASTER_NUM' => 1, // 讀寫分離後 主服務器數量 'DB_SLAVE_NO' => '', // 指定從服務器序號
找到後不能直接在系統配置文件裏修改,應該放到對應配置文件裏。配置文件除了系統配置文件外,還有分組/平臺配置文件和應用配置文件。mysql
那麼數據庫配置文件位置放到哪一個層級的配置文件呢?面試
實際開發裏,前臺後臺通常使用一個數據庫,也就是說一個項目一個數據庫,因此一個應用使用一個數據庫,因此放到應用層級的配置文件Application\Common\Conf\config.phpsql
裏。thinkphp
<?php return array( //'配置項'=>'配置值' /* 數據庫設置 */ 'DB_TYPE' => 'mysql', // 數據庫類型,除此外還有可能用到access,oracle,sqlite,db2 'DB_HOST' => 'localhost', // 服務器地址,如果遠程服務器,則填寫遠程IP 'DB_NAME' => 'db_oa', // 數據庫名 'DB_USER' => 'root', // 用戶名 'DB_PWD' => 'root', // 密碼 'DB_PORT' => '3306', // 端口 'DB_PREFIX' => 'sp_', // 數據庫表前綴,設置時必須加下劃線 );
(2)建立數據庫和數據表數據庫
數據庫名:db_oa數組
數據表名: sp_dept(department部門);緩存
準備好sql語句:服務器
create database db_oa;//建立數據庫 use db_oa;//調用數據庫 create table sp_dept( id int not null auto_increment, name varchar(50) not null, pid int not null default 0,//部門分上下級,pid只下級部門id sort int not null default 50,//排序 remark varchar(255),//備註說明 primary key(id) )engine=myisam default charset=utf8;//引擎myisam,Mysql的默認存儲引擎
知識點:not null不爲空;auto_increment自增;default默認;
這裏除了經過命令行cmd建立,還可使用Navicat Premium。它是一個可多重鏈接的數據庫管理工具,它可以讓你以單一程序同時鏈接到MySQL、SQL Server、SQLite、Oracle、
PostgreSQL數據庫,讓管理不一樣類型的數據庫更加方便。數據庫/表的具體建立及使用我在文章Navicat使用方法裏作了總結
(3)模型建立
1. 什麼是模型?
模型是MVC中的M(model),做用負責與數據表的數據交互(CURD,即建立Create、更新Update、讀取Retrieve和刪除Delete操做)
2. 模型的建立
①命名規範:模型名+Model關鍵詞+class.php(與控制器的命名規範大體相同:控制器名+Controller關鍵詞+class.php)
注意:由於模型是用來操做數據表,因此模型實例化時確定須要去關聯一張表。所以模型名要求是不帶前綴的表名,且首字母大寫
②代碼結構規範(與控制器相似)
第一步:聲明命名空間;
第二部:引入父類模型Model.class.php;
第三部:聲明並繼承父類模型。
3. 案例
例如後期須要部門模型DeptModel.class.php實現對部門數據表sp_dept的操做,模型名的命名通常爲關聯的數據表表名去掉前綴。這裏我在Admin/Model下建立模型文件
<?php namespace Admin\Model;//聲明命名空間(分組\目錄) use Think\Model;//引入父類模型(Think開頭是由於Think.class.php文件的命名空間爲Think) //聲明並繼承模型 class DeptModel extends Model{ } ?>
注意:空模型仍然能夠進行數據表的(CURD操做),由於繼承了父類模型,能夠執行基本的操做增刪改查,由於父類中已經封裝好了CURD方法
(4)模型實例化(建立控制器,鏈接數據表)
模型的本質是類,類在使用時須要實例化操做。
1. 普通實例化
經過本身編寫代碼來new對象,$obj接受實例化結果,而後實例化類建立出一個對象。接下來在控制器裏定義一個方法來實例化模型,使用普通方法實例化
建立部門控制器文件,Admin/Controller/DeptController.class.php:
<?php namespace Admin\Controller; use Think\Controller; class DeptController extends Controller{ public function dept(){ $model = new \Admin\Model\DeptModel(); dump($model); } } ?>
經過輸出結果,發現模型在控制器裏實例化的時候自動關聯了數據表,爲何自動關聯?
由於當前模型名字是表名去掉後綴。因此在控制器中進行實例化時,系統底層會自動關聯上相關的數據表。雖然模型裏沒有前綴,可是配置信息裏設置了數據表前綴
/* 數據庫設置 */ 'DB_PREFIX' => 'sp_', // 數據庫表前綴,設置時必須加下劃線
2. 快速實例化方法
上述實例化方法雖然能夠進行實例化操做,但使用麻煩,還需考慮命名空間。因此ThinkPHP爲了簡單快速高效開發,提供了兩個快速方法(M和D)來實例化模型。
D方法:$obj = D(['模型名']);
上述表示實例化咱們本身建立的模型(分組/Model目錄中),除了本身建立的模型外還有父類模型(系統模型)。若是傳遞了模型名,則實例化指定的模型;若沒有傳遞模型名或模型名不存在,則實例化系統模型(父類模型Model.class.php)
M方法:$obj = M(['不帶前綴的表名']);
表示直接實例化父類模型,即系統模型(Think/Model.class.php)。若指定了表名,則實例化父類模型時,關聯指定表;若沒有傳遞參數則不關聯表,不關聯時通常用於執行原生的sql語句(M()->query(原生的sql語句))
D和M方法區別:實例化對象不一樣
案例:
①實例化自定義模型,其實例化結果與普通new方法同樣
$model = D('Dept'); dump($model);
若不傳參數實例化,則會實例化父類模型(系統模型)。結果與上訴不一樣,系統模型Tnink/Model位置不一樣,且沒有關聯表
$model = D(); dump($model);
②實例化父類模型
若傳入了表名,則會在實例化時關聯數據表
$model = M('dept');//這裏傳遞了dept數據表,因此會在實例化時關聯dept數據表
$model = M();//實例化父類模型,但不關聯數據表 dump($model);
拓展:經典面試題:
①實例化方法中D方法和M方法區別?
實例化的對象不一樣。D方法將自定義的模式進行實例化,若自定義模型不存在,則實例化父類模型(系統模型),而M方法是直接實例化(父類)系統模型
②開發中如何選取實例化方法?
根據項目狀況,若當前須要的操做在父類中已經封裝好了,則直接實例化父類(M方法)。若父類中的方法不能知足開發需求,須要自定義方法,則可使用D方法實例化自定義模型。通常的增刪改查操做在父類模型裏已經封裝好了,直接使用M方法實例化便可
【五】CURD操做
模型操做數據表的基本操做
(1)增長操做
在MySQL裏增長操做語句是insert...into...,但在ThinkPHP裏系統封裝好了模型裏的方法add。
語法:$model->add(一維鍵值數組),注意:一維數組必須是一維的關聯數組,且鍵必須和數據表的字段名匹配。如不匹配則在增長時會被ThinkPHP過濾掉
案例:往部門表裏添加一條記錄
public function dept(){ $model = M('dept'); //聲明關聯數組 $person = array( 'name'=>'人事部', 'pid'=>'0', 'sort'=>'1', 'remark'=>'這是人事部門' ); $result = $model -> add($person);//返回新增記錄的主鍵id dump($result); }
補充:如何需添加多個記錄?
①循環;
②addAll方法,語法:$model->addAll(二維數組),要求最裏面的一維數組必須爲關聯數組(要求鍵名與數據表字段匹配),另外外層數組必須是從0開始的連續的索引數組
注意:雖然數組中順序無關,可是要求子數據的第一條數組的鍵名順序必須與數據表一致,後面的子數組鍵名順序隨意,由於後面的都會按照第一條的鍵名順序填寫
public function dept(){ $model = M('dept'); //聲明關聯數組 $person = array( array( 'remark'=>'這是人事部門2', 'name'=>'人事部2', 'pid'=>'0', 'sort'=>'1' ), array( 'remark'=>'這是人事部門1', 'name'=>'人事部1', 'pid'=>'0', 'sort'=>'1' ) ); $result = $model -> addAll($person);//返回新增記錄的逐漸id dump($result); }
(2)修改操做
在MySQL裏修改操做使用update table語句+where條件。在ThinkPHP中使用save方法,語法:$model->save(一維關聯數組)
條件須要一維關聯數組必須有主鍵信息(至關於where條件),若沒有主鍵信息,則至關於批量修改。在ThinkPHP裏,爲了仿製誤操做致使批量修改或刪除,不容許批量操做
案例:使用save方法修改部門表中財務部門信息
public function dept(){ //實例化模型 $model = M('dept'); //聲明關聯數組 $change = array( 'id'=>2,//當前表獲得主鍵,若是沒有指定主鍵信息,則返回值爲false。表示修改操做沒有執行 'name'=>'修改2', 'remark'=>'修改備註' ); $result = $model -> save($change);//返回值表示收到影響的行數 dump($result); }
注意:必須有主鍵信息(至關於where條件),不然返回false
(3)查詢操做
MySQL查詢操做爲select。在ThinPHP裏系統封裝了兩個方法用於查詢,select方法和find方法
select語法:①$model->$select(); 查詢所有信息
②$model->select(id); 查詢指定id的信息
③$model->select('id1,id2,id3,id4...'); 等價於MySQL的where id in('1,2,3,4'),表示查詢指定id集合的信息
find語法:①$model->find(); 查詢當前數據表的第一個信息,至關於limit 1;
②$model->find(id); 查詢表裏指定id的數據
區別:select方法返回值是二維數組,即便只查詢到了一條記錄也是返回二維數組;而find方法返回一維數組
案例:使用select和find方法查詢部門表中的數據
public function select(){ //實例化模型 $model = M('dept'); //select查詢
$result = $model->select();//查詢全部 $result = $model->select('1');//查詢id爲1的記錄
$result = $model->select('1,3,5');//查詢id爲1,3,5的記錄 dump($result); }
select方法即便只查詢一條數據,仍然會返回二維數組,以下
array(1) { [0] => array(5) { ["id"] => string(1) "1" ["name"] => string(3) "one" ["pid"] => string(1) "0" ["sort"] => string(2) "50" ["remark"] => string(9) "第一個" } }
對比find查詢結果以下
array(5) { ["id"] => string(1) "1" ["name"] => string(3) "one" ["pid"] => string(1) "0" ["sort"] => string(2) "50" ["remark"] => string(9) "第一個" }
find查詢:
public function select(){ //實例化模型 $model = M('dept'); //find查詢 $result = $model->find();//返回第一條記錄,至關於limit 1 $result = $model->find('2');//返回指定id所在的記錄 dump($result); }
(4)刪除操做
在MySQL中使用delete from語句刪除,在ThinkPHP裏系統封裝好了delete方法刪除記錄
語法:
①$model->delete(); //由於ThinkPHP不支持沒有指定主鍵的操做,因此該方法不支持
②$model->delete(id); 刪除指定id對應的記錄
③$model->delete('id1,id2,id3,...') 刪除多個id對應的記錄
注意:刪除分兩種物理刪除、邏輯刪除。
物理刪除:真刪除
邏輯刪除:假刪除,本質是修改操做。在數據表裏定義一個狀態字段status,取值0和1。當進行讀取時只會讀取狀態值爲1的數據,若用戶點擊刪除,則會觸發狀態status轉爲0。從而在讀取時獲取不到,形成刪除的假象。實際開發中也是常有邏輯刪除(信息就是資源!!)
案例:使用delete進行刪除操做(真刪除)
public function del(){ //實例化模型 $model = M('dept'); //delete刪除 $result = $model->delete();//返回false $result = $model->delete('1');//刪除指定id的記錄,返回影響行數 $result = $model->delete('1,2,3');//刪除多個id的記錄,返回影響行數 dump($result);
}
【六】Tp中的模型