ThinkPHP框架之模型

ThinkPHP

一、模型

 

1、 什麼是模型

 

數據表的一個實體

 

所有數據均來自模型

業務規則(增刪改查)

 

2、 定義規則

 

模型類的命名規則是除去表前綴的數據表名稱,採用駝峯法命名,並且首字母大寫,然後加上模型類的後綴定義Model

 

位置: /Lib/Model

UserModel            

UserTypeModel     

 

比如說,我們有一個表叫think_product

 

ProductModel

 

 

 

在控制器中嘗試實例化該模型對象,會報錯,連接數據失敗。


通過以上代碼,我們得出一個結論:在tp中,當我們創建一個模型對象時,tp會自動創建與數據庫的連接

 

當我們實例化一個子類模型對象,會執行父類模型Model中的構造函數,在Model中的構造函數裏,它去將Model中的db屬性實例化爲db類的類對象,當db類對象被實例化時會自動與數據建立連接

 

如何解決?

必須在配置文件中配置好數據庫相關信息

 

 

 

通過觀察,打印出來的對象,具有以下特點:

 

1)  具有db屬性,從父類模型繼承過來的,它是DbMySql類的實例

2)  當創建模型對象時,那麼,這個程序會自動分析我們當前表的表結構

3)  分析完表結構之後,會將當前表結構存儲在當前模型對象的$fields屬性中,這個屬性也是從父類模型繼承過來的,它是以數組形式體現,記錄的內容有:字段名、主鍵字段、是否自動增長

4)  如果開啓字段緩存,會將表結構緩存到文件中,便於下次引用

 

3、  實例化

 

在tp中,模型分爲兩種:

 

用戶自定義模型

 $student = new StudentModel();

$student = D ('Student');

基礎模型(Model)

 $student = new Model('student');

如果有特殊需求,那麼自定義模型並實例化

如果沒有特殊要求,可以直接使用Model

實例化時也有兩種方式:

實例化模型(實例化子類或父類Model)

快速實例化(簡寫函數 D、M)

 

 

4、  關於相關的配置選項

 

l  DB_TYPE :數據庫類型

l  DB_HOST :服務器地址

l  DB_USER :用戶名

l  DB_PWD :密碼

l  DB_NAME :數據庫名

l  DB_PREFIX :數據庫表前綴

l  DB_PORT :服務端口    如果是3306,這裏可以添空  ‘’

l  DB_CHARSET :編碼 

 

 

5、 關於增刪改查的快速入門

 add(); delete(); save(); select();

 

6、  定義字段

 

l  字段緩存保存在Runtime/Data/_fields/ 目錄下面

 開啓調試不會緩存字段文件。同時字段緩存可以單獨設置。


在配置文件中,'DB_FIELDS_CACHE'       => true,        // 啓用字段緩存,改成false即可。

數據庫.數據表.php

 

l  只要是不開啓調試模式都會生成字段緩存(字段緩存可以單獨設置關閉)。

開啓調試不會生成字段緩存文件

如果關閉調試,並且關閉字段緩存,說明每次都需要動態解析表結構,如果項目處於開發階段,並且數據庫結構經常改變,可以考慮這麼做。

l  可以通過設置DB_FIELDS_CACHE 參數來關閉字段自動緩存

l  可以在模型類裏面手動定義數據表字段的名稱,可以避免IO加載的效率開銷,在模

l  型類裏面添加fields屬性即可

如果關閉調試,關閉字段緩存,那說明是每次實例化時動態解析表結構

如果開啓字段緩存功能,說明每次都加載字段緩存文件

 

如果不需要動態解析或加載緩存文件,可以考慮在模型類中定義$fields的屬性指定所有字段列表

 

 

  //在關閉了字段緩存功能後,在模型中自定義了表結構:

        //打印對象發現其中有一個fields的屬性,是子類模型中定義的
        //在打印出的內容裏沒有看到show column的語句
        //說明沒有動態解析
        //提升了效率 



7、  創建數據, 即表單提交數據,

實例化子類模型纔會擁有自己定義的fields屬性,實例化基礎模型不會有這個屬性,最終程序還是會動態解析表結構,所有,

如果定義了fields屬性,就必須使用子類模型     

<formmethod=’post’>

       <input type=’text’name=’username’>

       <inputtype=’text’ name=’password’>

</form>

 

$_POST[’username’]

$_POST[’password’]

 

比如說,一個表有50個字段,像上面的代碼進行取值比較繁瑣,如何解決?

tp中的創建數據功能來解決這個問題

 

 

ThinkPHP可以幫助你快速地創建數據對象,最典型的應用就是自動根據表單數據創建數據對象,這個優勢在一個數據表的字段非常之多的情況下尤其明顯。

 

Create方法是默認是從$_POST獲取數據

執行完create方法後,當前模型對象的data屬性裏保存的就是提交的所有數據

如果表單以get形式提交的

Create方法可以從一個數組中獲取數據

 

$student->create($_GET);

 

$student->create(array());


    public function addok(){
    
        $student = new StudentModel();
        $student->create();//默認從$_POST中取數據
        
        var_dump($student);
        $student->add();//此時沒有傳遞array數組
    }


在上一題中,如果表中有哪些字段,那麼,表單中就必須使用相同的字段名稱,但是這樣一來,會在客戶端源文件中暴露真實的字段名稱,會給服務器帶來安全隱患,如何解決?
8、字段映射

 

ThinkPHP的字段映射功能可以讓你在表單中隱藏真正的數據表字段,而不用擔心放棄自動創建表單對象的功能

 

我們可以在子類模型中,添加如下代碼:

 

l  protected $_map = array(

              ‘name'   => ‘username',

              ‘pwd’ => ‘userpwd’

                     假名              真名

);

 

 

然後,將表單內容修改如下:

 

再次運行程序,可以錄入成功!

 

 

如果我們得到了表中數據,如何將數據中的字段轉成假名?

 

 

 

9、表名操作

 

l  在一個數據庫中,如果部署了多個項目,那麼我們可以使用表前綴解決問題

 

項目A:

       Admin

項目B:

       Admin

 

在配置文件中,使用下面這個選項來設置表前綴

 

‘DB_PREFIX'=>‘think_’

 

        think_product

        think_product_type

 

1)比如說:我們有一個表叫think_students,那麼定義模型時

 

Class StudentsModel

 

但是由於一些特殊原因:我只想把名稱改爲

Class StudentModel

 

可以在模型中使用tableName來設置

 

2)比如說:我們項目中一個表沒有表前綴,那麼如何定義模型?

Think_

Think_

Product

 

可以在模型中定義trueTableName來設置

 

反覆修改表名,運行上面代碼,觀察變化。

 

1)表名爲:think_products,模型是   productModel

 

       使用tableName屬性

 

2)表名爲products,模型是  ProductModel

      

       使用trueTableName屬性

 

10、事務處理

 

$User->startTrans()

開啓事務

$User->commit() 

提交事務

$User->rollback() 

回滾事務

 

 

 

11、ActiveRecord   注意與普通方式的區別

 

AR模式--也可以叫ER模式

 

我們項目中有若干個事物,每個事物對應一個表

 

將表映射到類

將記錄映射到對象

將字段映射到對象屬性

 

class Person{

 

//     private$name;

//     private$age;

       private$data=array();

//     publicfunction setName($value){$this->name=$value}

//     publicfunction getName(){return $this->name}

 

       Public function __set($name,$value){

       //     $this->$name=$value;

              $this->data[$name]=$value;

              $this->data[‘age’]=30;

}

 

       Public function __get($name){

              Return$this->$name;

}

      

 

       public function insert(){

              insertinto person values(null,‘$this->data[name]’,’$this->data[age]’):

}

}

 

$person=new Person();

$person->name=’zhangsan’;

$person->age=30;

$person->insert();

 

1) 增加

     public function test3(){
        $stu = new StuModel();
        $stu->name = 'hello';
        $stu->age = 33;
        $stu->add();
    }

 

2) 修改

     /**
     * AR模式操作數據庫
     */
    public function test4(){
        $stu = new StuModel();
        $stu->id = 2;
        $stu->name = 'hell';
        $stu->age = 44;
        $stu->save();
    }

 

3) 刪除

     /**
     * AR模式操作數據庫
     */
    public function test5(){
        $stu = new StuModel();
        $stu->id = 2;

        $stu->delete();
    }

 

4) 查詢

 

     /**
     * AR模式操作數據庫
     */
    public function test6(){
        $stu = new StuModel();
        $stu->id = 1;
        
        //從對象中獲取
        $stu->find();
        echo $stu->name;
        echo $stu->age;
    }
    /**
     * AR模式操作數據庫
     */
    public function test7(){
        $stu = new StuModel();
        //$stu->id = 1;
    
        //從對象中獲取
        //$stu->find();
        $list = $stu->select();
        var_dump($list);
    }

 

 

 

 

 

12、CRUD操作

 

創建操作(Create)

讀取數據(Read)

更新數據(Update)

刪除數據(Delete)

 

1) 創建操作

     /**
     * CRUD操作
     */
    public function test8(){
        $stu = new StuModel();
        /* //第一種方式
        $arr = array (
                'name' => 'lisi',
                'age' => 33,
        );
        $stu->add($arr); */
        
        /* //第二種方式(表單提交的方式)
        $stu->create ( array (
                'name' => 'zhangsan',
                'age' => 26
        ) );//默認從$_POST中接收數據
        $stu->add(); */
        
        //第三種方式--一次性插入多條
        $dataList = array(array (
                        'name' => 'wangwu',
                        'age' => 22
                ),array (
                        'name' => '小李子',
                        'age' => 44
                ));
        $stu->addAll($dataList);
    }


2)修改操作

     /**
     * CRUD操作
     */
    public function test9(){
        $stu = new StuModel();
        
        /* //第一種方式
        $stu->create ( array (
                'id' =>3,
                'name' => 'xxxx',
                'age' => 66
        ) );
        $stu->save(); */
        
        $stu->save ( array (
                'id' => 3,
                'name' => 'uuuuu',
                'age' => 55
        ) );
    }

3)刪除操作

     /**
     * CRUD操作--D
     */
    public function test10(){
        $stu = new StuModel();
        
        //第一種方式
        $stu->delete(4);
        
        //第二種方式
        $stu->delete('5,6,7,8');
    }


4)查詢操作

 

    /**
     * CRUD操作--R
     */
    public function test11(){
        $stu = new StuModel();
    
        //第一種方式
        $row = $stu->find(2);
        print_r($row);
    
        //第二種方式
        $list = $stu->select();
        print_r($list);
    }

 

 另外一種用法:


    public function test12(){
        $stu = D ('students');
        
        $stu->find(4);
        
        $stu->name ='test';
        
        $stu->save();
    }

發佈了89 篇原創文章 · 獲贊 20 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章