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();
}