ThinkPHP---thinkphp模型(M)

(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中的模型

具體在文章視頻學習筆錄---ThinkPHP---thinkphp模型(M)拓展裏做總結

相關文章
相關標籤/搜索