《PHP應用:ThinkPHP模型詳解》要點:
本文介紹了PHP應用:ThinkPHP模型詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:thinkphp教程
模型定義,默認情況下,ThinkPHP的模型類是位于/Home/Model/目錄之下,模型類通常必要繼承系統的\Think\Model類或其子類,下面是一個Home\Model\UserModel類的定義:PHP實例
文件命名遵守UserModel.class.php的方式,跟控制器的命名一樣
PHP實例
<?php namespace Home\Model; use Think\Model; class UserModel extends Model { }
模型類的作用大多數情況是操作數據表的,如果依照系統的規范來命名模型類的話,大多數情況下是可以自動對應數據表,但你可以根據自己的需求來定制自己的數據表設置和操作.PHP實例
首先我們必要在配置文件設置我們的數據庫連接信息:PHP實例
'DB_TYPE' => 'mysql', 'DB_HOST' => 'localhost', 'DB_NAME' => 'database', 'DB_USER' => 'username', 'DB_PWD' => 'password', 'DB_PORT' => '3306',
這些配置信息還是在/Home/Conf/config.php文件里設置.PHP實例
指定數據表前綴PHP實例
指定標前綴,我們在第一課的配置項已經指定,以下的筆墨表示你可以靈活配置你的數據表.PHP實例
protected $tablePrefix = 'top_';
如果數據庫的表沒有表前綴,使用空字符串代替
PHP實例
protected $tablePrefix = '';
指定數據表,此處的指定的數據表的不必要添加表前綴:
PHP實例
protected $tableName = 'user';
舉個例子說,比如說你的數據庫中有一個沒有表前綴的,名為users的數據表,可以用以下的兩種辦法在模型中進行下面的定義:PHP實例
第一,直接根據系統的規范來命名模型類來命名模型,好比說就命名為UsersModel那么只需要在這個類里面加上下面的設置就可以了:PHP實例
protected $tablePrefix = '';
ThinkPHP系統就會自動定位到users表了.PHP實例
第二種情況時,如果你的模型類沒有依照系統規范來命名,比如說不小心命名為UserModel,這種情況下可以同時指定表前綴和表明,比如:PHP實例
protected $tablePrefix = ''; protected $tableName = 'users';
或者你直接指定trueTableName:PHP實例
protected $trueTableName = 'users';PHP實例
既然模型通常是用來操作數據表,那么我們來看看模型的基本CURD:PHP實例
注:為了方便演示,我們在UserController中定義一個testDemo()辦法用于演示PHP實例
public function testDemo() { }
以下的代碼將會一段一段在這個方法里演示,你可以通過拜訪http://localhost:8999/index.php/Home/User/testDemo來看到實際效果.PHP實例
添加紀錄PHP實例
$user = M('User'); $data['username'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $user->create($data); $record = $user->add(); dump($record);
add()返回的是插入數據的id,對于不存在的表字段,add()辦法會自動過濾.PHP實例
讀取紀錄PHP實例
在ThinkPHP中讀取數據的方式很多,通常分為讀取數據、讀取數據集和讀取字段值PHP實例
$user = M('User'); $record = $user->where('username="ThinkPHP"')->find(); dump($record);
讀取字段值PHP實例
$user = M('User'); $record = $user->where('id=3')->getField('username'); dump($record);
默認情況下,當只有一個字段的時候,返回滿足條件的數據表中的該字段的第一行的值.如果getField()傳入多個字段,返回值將是一個關聯數組:PHP實例
$user = M('User'); $record = $user->getField('username,email'); dump($record);
這個數組總是以傳入的第一個第一個字段為鍵值的.如果修改為:PHP實例
$user = M('User'); $record = $user->getField('email,username'); dump($record);
將上面的兩次代碼分別放到testDemo(),你就會看到不一樣的結果集.PHP實例
用save()辦法更新數據PHP實例
$user = M('User'); $data['username'] = 'ThinkPHPSave'; $data['email'] = 'ThinkPHPSave@outlook.com'; $record = $user->where('id=3')->save($data); dump($record);
這里的$record返回的事1,表示成功更改.PHP實例
當然,你也可以這樣:PHP實例
$user = M('User'); $user->username = 'ThinkPHP'; $user->email = 'ThinkPHP@outlook.com'; $record = $user->where('id=3')->save(); dump($record);
日常開發的時候經常會遇到一些只更新某些字段的情況,可以通過下面的方式來實現:PHP實例
$user = M("User"); $record = $user->where('id=4')->setField('username','ThinkPHPChangeName'); dump($record);
同時更新多個字段,可以將數據以數組的形式傳給setField()辦法:PHP實例
$user = M('User'); $data = array('username'=>'ThinkPHPChangeArray','email'=>'ThinkPHP@array.com'); $record = $user-> where('id=6')->setField($data); dump($record);
ThinkPHP刪除數據使用delete辦法,例如:PHP實例
$user = M('User'); $record = $user->where('id=3')->delete(); dump($record);
或者你可以直接使用:PHP實例
$record = $user->delete('1,2,5'); dump($record);
這樣就達到了刪除主鍵1,2,5這三條紀錄了.PHP實例
ActiveRecordsPHP實例
ThinkPHP實現了ActiveRecords模式的ORM模型,采用了非標準的ORM模型:表映射到類,記錄映射到對象.以下實例將使用ActiveRecords重現對數據表的CURD,看看ActiveRecords給我們帶來了什么好處.PHP實例
$user = M("User"); $user->username = 'ThinkPHPWithActive'; $user->email = 'ThinkPHPActive@gmail.com'; $record = $user->add(); dump($record);
讀取紀錄PHP實例
AR最大的特點可能便是它的查詢模式了,模式簡單易用,因為更多情況下面查詢條件都是以主鍵或者某個關鍵的字段.這種類型的查詢,ThinkPHP有著很好的支持.PHP實例
好比說獲取主鍵為2的用戶信息:PHP實例
$user = M("User"); $record = $user->find(2); dump($record);
直接不用where()查詢了,簡單友好吧.再好比:PHP實例
$user = M("User"); $record = $user->getByUsername("jelly"); dump($record);
如果是查詢多條紀錄,使用以下方式:PHP實例
$user = M("User"); $record = $user->select('1,3,8'); dump($record);
更新記錄PHP實例
$user = M("User"); $user->find(21); $user->username = 'TOPThinkChangeWithAR'; $record = $user->save(); dump($record);
刪除記錄PHP實例
刪除單條紀錄
PHP實例
$user = M("User"); $record = $user->delete(8); dump($record);
刪除多條紀錄
PHP實例
$user = M("User"); $record = $user->delete('15,16'); dump($record); // todo: 這里的自動驗證和關聯模型 調試不出來.
自動完成PHP實例
自動完成是ThinkPHP提供用來完成數據自動處理和過濾的辦法,當使用create()辦法創建數據對象的時候會觸發自動完成數機制.
PHP實例
因此,在ThinkPHP鼓勵使用create()方法來創建數據對象,因為這是一種更加平安的方式,直接通過add()或者save()方法實現數據寫入無法出發自動完成機制.PHP實例
自動完成通常用來完成默認字段寫入(比如添加時間戳),平安字段過濾(比如加密密碼)以及業務邏輯的自動處理等.可以通過模型類里面通過$_auto屬性定義處理規則.下面演示如何自動完成添加時間戳:PHP實例
在UserModel中,聲明自動完成的定義數組$_auto :PHP實例
protected $_auto = array ( array('created_at','date("Y-m-d H:i:s", time())',3,'function'), array('updated_at','date("Y-m-d H:i:s", time())',3,'function'), );
還有一種是理由auto()辦法動態設置自動完成的機制,可以到官方文檔去看看PHP實例
設置完成之后,我們在testDemo()辦法中創建一條用戶數據:PHP實例
$user = D('User'); $data['username'] = "ThinkPHP"; $data['email'] = "ThinkPHP@gmail.com"; $user->create($data); $record = $user->add(); dump($record);
測試,如果返回紀錄的id值,說明用戶紀錄創建成功.要驗證數據是否自動完成,你可以直接使用:PHP實例
$user = D('User'); $record = $user->find(id); dump($record);
自動驗證PHP實例
自動驗證是ThinkPHP模型層提供的一種數據驗證辦法,可以在使用create()創建數據對象的時候自動進行數據驗證.PHP實例
數據驗證可以進行數據類型、業務規則、平安判斷等方面的驗證操作.PHP實例
通常用于表單驗證PHP實例
數據驗證有兩種方式:PHP實例
靜態方式:在模型類里面通過$_validate屬性定義驗證規則.PHP實例
動態方式:使用模型類的validate()辦法動態創建自動驗證規則.PHP實例
無論是什么方式,驗證規則的定義是統一的規則,定義格式為:PHP實例
array(
???? array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),
???? array(驗證字段2,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),
???? ......
);
下面以$_validate靜態方式舉例如何使用自動驗證:PHP實例
在UserController中創建register()辦法,對,幾乎每一個Web應用都需要實現用戶注冊這一步.
PHP實例
public function register() { $this->display(); }
對,就是這么簡單,這個辦法只是將相應的視圖文件渲染出來.所以接下來我們創建對應的視圖文件,也就是:./Application/Home/View/User/register.htmlPHP實例
<extend name="Index/base" /> <block name="main" > <form method="post" action="__URL__/registerValidate"> <div class="form-group"> <label for="exampleInputName">Name</label> <input type="text" name="username" class="form-control" id="exampleInputName" placeholder="Name"> </div> <div class="form-group"> <label for="exampleInputEmail">Email</label> <input type="email" name="email" class="form-control" id="exampleInputEmail" placeholder="Email"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> </block>
上面就是一些HTML代碼和一點模板的知識,對于模板,我們后續會講到,但不管怎樣,現在我們拜訪
http://localhost:8999/Home/User/register,就可以看到我們的注冊表單頁面了.PHP實例
注意到form表單中,action="__URL__/registerValidate",這表示提交到當前的控制器的registerValidate()辦法處理,所以我們在UserController中增加registerValidate()辦法:PHP實例
public function registerValidate() { $data['username'] = $_POST['username']; $data['email'] = $_POST['email']; $user = D("User"); if ( !$user->create($data) ) { exit($user->getError()); } //todo: validation passes, add data to database and redirect somewhere echo 'validation passes'; }
這里的if ( !$user->create($data) )會觸發自動驗證并判斷驗證是否通過驗證.你可以嘗試在表單里填寫不同的數據來進行測試,也可以修改一下驗證規則,更多規則可以到官網查看:PHP實例
http://document.thinkphp.cn/manual_3_2.html#auto_validatePHP實例
關聯模型PHP實例
通常我們所說的關聯關系包含下面三種:PHP實例
一對一關聯 :ONE_TO_ONE,包含HAS_ONE 和 BELONGS_TO
一對多關聯 :ONE_TO_MANY,包含HAS_MANY 和 BELONGS_TO
多對多關聯 :MANY_TO_MANYPHP實例
關聯定義PHP實例
ThinkPHP可以很輕松的完成數據表的關聯CURD操作,目前支持的關聯關系包含下面四種:
HAS_ONE、BELONGS_TO、HAS_MANY和MANY_TO_MANY.
一個模型根據業務模型的復雜程度可以同時定義多個關聯,不受限制,所有的關聯定義都統一在模型類的 $_link 成員變量里面定義,并且可以支持動態定義.要支持關聯操作,模型類必須繼承Think\Model\RelationModel類,關聯定義的格式類似于:PHP實例
namespace Home\Model; use Think\Model\RelationModel; class UserModel extends RelationModel{ protected $_link = array( '關聯' => array( '關聯屬性1' => '定義', '關聯屬性N' => '定義', ), ); }
關于關聯屬性的定義和值,你可以到官方文檔仔細查看,我們下面也會給出一些最常用的.PHP實例
在我們的講解例子中,會采用HAS_MANY和BELONGS_TO來演示,對于其他的幾個關系模型,可以參考官方文檔舉一反三.PHP實例
首先我們知道數據庫里面有兩張表,用戶表和文章表,并且我們也為其創建了不同的模型(UserModel ArticelModel).PHP實例
現在我們仔細來想想他們之間的對應關系:一個用戶可以擁有多篇文章,而每一篇文章都屬于某個特定的用戶.所以我們可以分別為這兩種關系添加關聯模型:PHP實例
在UserModel中:PHP實例
protected $_link = array( 'Article' => self::HAS_MANY );
在ArticleModel中:PHP實例
protected $_link = array( 'User' => self::BELONGS_TO );
以上者兩種都是最簡潔的模型關聯聲明.因為在最開始設計數據庫的時候,我們遵守了ThinkPHP的官方的規范:PHP實例
外鍵的默認規則是當前數據對象名稱_id,例如:UserModel對應的可能是表think_user,那么think_user表的外鍵默認為user_id,如果你的外鍵不是user_id,而是其他自定義的字段如:user_identify,那么就必需在定義關聯的時候定義 foreign_key .如下:PHP實例
在UserModel中:PHP實例
protected $_link = array( 'mapping_type' => self::HAS_MANY, 'class_name' => 'Article', 'foreign_key' => 'user_identify', );
更多自定義的關聯模型參數可以到官網查看.PHP實例
有了以上的定義之后,我們就可以在檢索用戶數據的同時將屬于他的文章也一起檢索出來,使用relation().PHP實例
同樣是在testDemo()這個辦法中:PHP實例
$user = D('User'); $record = $user->relation(true)->find(4); dump($record);
拜訪熟悉的http://localhost:8999/Home/User/testDemo,你將會看到神奇的結果.PHP實例
以上所述便是本文的全部內容了,希望大家能夠喜歡.PHP實例
《PHP應用:ThinkPHP模型詳解》是否對您有啟發,歡迎查看更多與《PHP應用:ThinkPHP模型詳解》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9409.html