亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

ThinkPHP模型詳解

2024-05-04 23:38:06
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了ThinkPHP模型詳解的相關資料,需要的朋友可以參考下

模型定義,默認情況下,ThinkPHP的模型類是位于/Home/Model/目錄之下,模型類通常需要繼承系統的/Think/Model類或其子類,下面是一個Home/Model/UserModel類的定義:

文件命名遵守UserModel.class.php的方式,跟控制器的命名一樣

 

 
  1. <?php 
  2. namespace Home/Model; 
  3.  
  4. use Think/Model; 
  5.  
  6. class UserModel extends Model { 

模型類的作用大多數情況是操作數據表的,如果按照系統的規范來命名模型類的話,大多數情況下是可以自動對應數據表,但你可以根據自己的需求來定制自己的數據表設置和操作。

首先我們需要在配置文件設置我們的數據庫連接信息:

 

 
  1. 'DB_TYPE' => 'mysql',  
  2. 'DB_HOST' => 'localhost',  
  3. 'DB_NAME' => 'database',  
  4. 'DB_USER' => 'username',  
  5. 'DB_PWD' => 'password',  
  6. 'DB_PORT' => '3306',  

這些配置信息還是在/Home/Conf/config.php文件里設置。

指定數據表前綴

指定標前綴,我們在第一課的配置項已經指定,以下的文字表示你可以靈活配置你的數據表。

 

 
  1. protected $tablePrefix = 'top_'

如果數據庫的表沒有表前綴,使用空字符串代替

 

 
  1. protected $tablePrefix = ''

指定數據表,此處的指定的數據表的不需要添加表前綴:

 

 
  1. protected $tableName = 'user'

舉個例子說,比如說你的數據庫中有一個沒有表前綴的,名為users的數據表,可以用以下的兩種方法在模型中進行下面的定義:

第一,直接根據系統的規范來命名模型類來命名模型,比如說就命名為UsersModel那么只需要在這個類里面加上下面的設置就可以了:

 

 
  1. protected $tablePrefix = ''

ThinkPHP系統就會自動定位到users表了。

第二種情況時,如果你的模型類沒有按照系統規范來命名,比如說不小心命名為UserModel,這種情況下可以同時指定表前綴和表明,比如:

 

 
  1. protected $tablePrefix = ''
  2.  
  3. protected $tableName = 'users'

或者你直接指定trueTableName:

protected $trueTableName = 'users';

既然模型通常是用來操作數據表,那么我們來看看模型的基本CURD:

注:為了方便演示,我們在UserController中定義一個testDemo()方法用于演示

 

 
  1. public function testDemo() 
  2.  

以下的代碼將會一段一段在這個方法里演示,你可以通過訪問http://localhost:8999/index.php/Home/User/testDemo來看到實際效果。

添加紀錄

 

 
  1. $user = M('User'); 
  2. $data['username'] = 'ThinkPHP'
  3. $data['email'] = 'ThinkPHP@gmail.com'
  4. $user->create($data); 
  5. $record = $user->add(); 
  6. dump($record); 

add()返回的是插入數據的id,對于不存在的表字段,add()方法會自動過濾。

讀取紀錄

在ThinkPHP中讀取數據的方式很多,通常分為讀取數據、讀取數據集和讀取字段值

 

 
  1. $user = M('User'); 
  2.  
  3. $record = $user->where('username="ThinkPHP"')->find(); 
  4.  
  5. dump($record); 

讀取字段值

 

 
  1. $user = M('User'); 
  2.  
  3. $record = $user->where('id=3')->getField('username'); 
  4.  
  5. dump($record); 

默認情況下,當只有一個字段的時候,返回滿足條件的數據表中的該字段的第一行的值.如果getField()傳入多個字段,返回值將是一個關聯數組:

 

 
  1. $user = M('User'); 
  2.  
  3. $record = $user->getField('username,email'); 
  4. dump($record);<br> 

這個數組總是以傳入的第一個第一個字段為鍵值的。如果修改為:

 

 
  1. $user = M('User'); 
  2.  
  3. $record = $user->getField('email,username'); 
  4.  
  5. dump($record); 

將上面的兩次代碼分別放到testDemo(),你就會看到不一樣的結果集。

用save()方法更新數據

 

 
  1. $user = M('User'); 
  2.  
  3. $data['username'] = 'ThinkPHPSave'
  4. $data['email'] = 'ThinkPHPSave@outlook.com'
  5.  
  6. $record = $user->where('id=3')->save($data); 
  7.  
  8. dump($record); 

這里的$record返回的事1,表示成功更改。

當然,你也可以這樣:

 

 
  1. $user = M('User'); 
  2.  
  3. $user->username = 'ThinkPHP'
  4. $user->email = 'ThinkPHP@outlook.com'
  5.  
  6. $record = $user->where('id=3')->save(); 
  7.  
  8. dump($record); 

日常開發的時候經常會遇到一些只更新某些字段的情況,可以通過下面的方式來實現:

 

 
  1. $user = M("User");  
  2. $record = $user->where('id=4')->setField('username','ThinkPHPChangeName'); 
  3.  
  4. dump($record); 

同時更新多個字段,可以將數據以數組的形式傳給setField()方法:

 

 
  1. $user = M('User'); 
  2. $data = array('username'=>'ThinkPHPChangeArray','email'=>'ThinkPHP@array.com'); 
  3. $record = $user-> where('id=6')->setField($data); 
  4. dump($record); 

ThinkPHP刪除數據使用delete方法,例如:

 

 
  1. $user = M('User'); 
  2. $record = $user->where('id=3')->delete(); 
  3. dump($record); 

或者你可以直接使用:

 

 
  1. $record = $user->delete('1,2,5'); 
  2. dump($record); 

這樣就達到了刪除主鍵1,2,5這三條紀錄了。

ActiveRecords

ThinkPHP實現了ActiveRecords模式的ORM模型,采用了非標準的ORM模型:表映射到類,記錄映射到對象。以下實例將使用ActiveRecords重現對數據表的CURD,看看ActiveRecords給我們帶來了什么好處。

 

 
  1. $user = M("User"); 
  2.  
  3. $user->username = 'ThinkPHPWithActive'
  4. $user->email = 'ThinkPHPActive@gmail.com'
  5.  
  6. $record = $user->add(); 
  7.  
  8. dump($record); 

讀取紀錄

AR最大的特點可能就是它的查詢模式了,模式簡單易用,因為更多情況下面查詢條件都是以主鍵或者某個關鍵的字段。這種類型的查詢,ThinkPHP有著很好的支持。

比如說獲取主鍵為2的用戶信息:

 

 
  1. $user = M("User"); 
  2.  
  3. $record = $user->find(2); 
  4.  
  5. dump($record); 

直接不用where()查詢了,簡單友好吧。再比如:

 

 
  1. $user = M("User"); 
  2.  
  3. $record = $user->getByUsername("jelly"); 
  4.  
  5. dump($record); 

如果是查詢多條紀錄,使用以下方式:

 

 
  1. $user = M("User"); 
  2.  
  3. $record = $user->select('1,3,8'); 
  4.  
  5. dump($record); 

更新記錄

 

 
  1. $user = M("User"); 
  2. $user->find(21); 
  3. $user->username = 'TOPThinkChangeWithAR'
  4. $record = $user->save(); 
  5.  
  6. dump($record); 

刪除記錄

刪除單條紀錄

 

 
  1. $user = M("User"); 
  2.  
  3. $record = $user->delete(8); 
  4.  
  5. dump($record); 

刪除多條紀錄

 

 
  1. $user = M("User"); 
  2.  
  3. $record = $user->delete('15,16'); 
  4.  
  5. dump($record); 
  6.  
  7. // todo: 這里的自動驗證和關聯模型 調試不出來。 

自動完成

自動完成是ThinkPHP提供用來完成數據自動處理和過濾的方法,當使用create()方法創建數據對象的時候會觸發自動完成數機制。

因此,在ThinkPHP鼓勵使用create()方法來創建數據對象,因為這是一種更加安全的方式,直接通過add()或者save()方法實現數據寫入無法出發自動完成機制。

自動完成通常用來完成默認字段寫入(比如添加時間戳),安全字段過濾(比如加密密碼)以及業務邏輯的自動處理等??梢酝ㄟ^模型類里面通過$_auto屬性定義處理規則。下面演示如何自動完成添加時間戳:

在UserModel中,聲明自動完成的定義數組$_auto :

 

 
  1. protected $_auto = array ( 
  2. array('created_at','date("Y-m-d H:i:s", time())',3,'function'), 
  3. array('updated_at','date("Y-m-d H:i:s", time())',3,'function'), 
  4. ); 

還有一種是理由auto()方法動態設置自動完成的機制,可以到官方文檔去看看

設置完成之后,我們在testDemo()方法中創建一條用戶數據:

 

 
  1. $user = D('User'); 
  2. $data['username'] = "ThinkPHP"
  3. $data['email'] = "ThinkPHP@gmail.com"
  4. $user->create($data); 
  5. $record = $user->add(); 
  6. dump($record); 

測試,如果返回紀錄的id值,說明用戶紀錄創建成功。要驗證數據是否自動完成,你可以直接使用:

 

 
  1. $user = D('User'); 
  2. $record = $user->find(id); 
  3. dump($record); 

自動驗證

自動驗證是ThinkPHP模型層提供的一種數據驗證方法,可以在使用create()創建數據對象的時候自動進行數據驗證。

數據驗證可以進行數據類型、業務規則、安全判斷等方面的驗證操作。

通常用于表單驗證

數據驗證有兩種方式:

靜態方式:在模型類里面通過$_validate屬性定義驗證規則。

動態方式:使用模型類的validate()方法動態創建自動驗證規則。

無論是什么方式,驗證規則的定義是統一的規則,定義格式為:

array(

array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),

array(驗證字段2,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),

......

);

下面以$_validate靜態方式舉例如何使用自動驗證:

在UserController中創建register()方法,對,幾乎每一個Web應用都需要實現用戶注冊這一步。

 

 
  1. public function register() 
  2. $this->display(); 

對,就是這么簡單,這個方法只是將相應的視圖文件渲染出來。所以接下來我們創建對應的視圖文件,也就是:./Application/Home/View/User/register.html

 

  1. <extend name="Index/base" /> 
  2. <block name="main" > 
  3. <form method="post" action="__URL__/registerValidate"
  4. <div class="form-group"
  5. <label for="exampleInputName">Name</label> 
  6. <input type="text" name="username" class="form-control" id="exampleInputName" placeholder="Name"
  7. </div> 
  8. <div class="form-group"
  9. <label for="exampleInputEmail">Email</label> 
  10. <input type="email" name="email" class="form-control" id="exampleInputEmail" placeholder="Email"
  11. </div> 
  12.  
  13. <button type="submit" class="btn btn-default">Submit</button> 
  14. </form> 
  15. </block> 

上面就是一些HTML代碼和一點模板的知識,對于模板,我們后續會講到,但不管怎樣,現在我們訪問

http://localhost:8999/Home/User/register,就可以看到我們的注冊表單頁面了。

注意到form表單中,action="__URL__/registerValidate",這表示提交到當前的控制器的registerValidate()方法處理,所以我們在UserController中增加registerValidate()方法:

 

 
  1. public function registerValidate() 
  2. $data['username'] = $_POST['username']; 
  3. $data['email'] = $_POST['email']; 
  4.  
  5. $user = D("User"); 
  6.  
  7. if ( !$user->create($data) ) { 
  8. exit($user->getError()); 
  9. //todo: validation passes, add data to database and redirect somewhere 
  10.  
  11. echo 'validation passes'
  12.  

這里的if ( !$user->create($data) )會觸發自動驗證并判斷驗證是否通過驗證。你可以嘗試在表單里填寫不同的數據來進行測試,也可以修改一下驗證規則,更多規則可以到官網查看:

http://document.thinkphp.cn/manual_3_2.html#auto_validate

關聯模型

通常我們所說的關聯關系包括下面三種:

一對一關聯 :ONE_TO_ONE,包括HAS_ONE 和 BELONGS_TO

一對多關聯 :ONE_TO_MANY,包括HAS_MANY 和 BELONGS_TO

多對多關聯 :MANY_TO_MANY

關聯定義

ThinkPHP可以很輕松的完成數據表的關聯CURD操作,目前支持的關聯關系包括下面四種:

HAS_ONE、BELONGS_TO、HAS_MANY和MANY_TO_MANY。

一個模型根據業務模型的復雜程度可以同時定義多個關聯,不受限制,所有的關聯定義都統一在模型類的 $_link 成員變量里面定義,并且可以支持動態定義。要支持關聯操作,模型類必須繼承Think/Model/RelationModel類,關聯定義的格式類似于:

 

 
  1. namespace Home/Model; 
  2. use Think/Model/RelationModel; 
  3. class UserModel extends RelationModel{ 
  4. protected $_link = array( 
  5. '關聯' => array( 
  6. '關聯屬性1' => '定義'
  7. '關聯屬性N' => '定義'
  8. ), 
  9. ); 

關于關聯屬性的定義和值,你可以到官方文檔仔細查看,我們下面也會給出一些最常用的。

在我們的講解例子中,會采用HAS_MANY和BELONGS_TO來演示,對于其他的幾個關系模型,可以參考官方文檔舉一反三。

首先我們知道數據庫里面有兩張表,用戶表和文章表,并且我們也為其創建了不同的模型(UserModel ArticelModel)。

現在我們仔細來想想他們之間的對應關系:一個用戶可以擁有多篇文章,而每一篇文章都屬于某個特定的用戶。所以我們可以分別為這兩種關系添加關聯模型:

在UserModel中:

 

 
  1. protected $_link = array( 
  2. 'Article' => self::HAS_MANY 
  3. ); 

在ArticleModel中:

 

 
  1. protected $_link = array( 
  2. 'User' => self::BELONGS_TO 
  3. ); 

以上者兩種都是最簡潔的模型關聯聲明。因為在最開始設計數據庫的時候,我們遵守了ThinkPHP的官方的規范:

外鍵的默認規則是當前數據對象名稱_id,例如:UserModel對應的可能是表think_user,那么think_user表的外鍵默認為user_id,如果你的外鍵不是user_id,而是其他自定義的字段如:user_identify,那么就必須在定義關聯的時候定義 foreign_key 。如下:

在UserModel中:

 

 
  1. protected $_link = array( 
  2. 'mapping_type' => self::HAS_MANY, 
  3. 'class_name' => 'Article'
  4. 'foreign_key' => 'user_identify'
  5. ); 

更多自定義的關聯模型參數可以到官網查看。

有了以上的定義之后,我們就可以在檢索用戶數據的同時將屬于他的文章也一起檢索出來,使用relation()。

同樣是在testDemo()這個方法中:

 

 
  1. $user = D('User'); 
  2. $record = $user->relation(true)->find(4); 
  3. dump($record); 
 

 

 

訪問熟悉的http://localhost:8999/Home/User/testDemo,你將會看到神奇的結果。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久精品日日躁夜夜躁国产| 精品国偷自产在线视频| 亚洲一级黄色片| 日韩免费观看av| 九九热最新视频//这里只有精品| 久久久久免费精品国产| 26uuu亚洲伊人春色| 成人免费午夜电影| 国内精品久久久久久久久| 亚洲国产精品小视频| 久久久久免费视频| 国产精品18久久久久久首页狼| 麻豆成人在线看| 久久精品亚洲94久久精品| 国产精品亚洲欧美导航| 日韩中文字幕第一页| 亚洲国产精品999| 一本色道久久88精品综合| 欧美精品日韩三级| 5566成人精品视频免费| 欧美另类老肥妇| 久久久久久12| 国产在线观看91精品一区| 91久久中文字幕| 亚洲成人久久电影| 日韩精品在线私人| 欧美日韩在线一区| 亚洲美腿欧美激情另类| 久久这里只有精品99| 亚洲欧美国产日韩天堂区| 亚洲午夜国产成人av电影男同| 欧美精品成人91久久久久久久| 日韩成人免费视频| 狠狠躁夜夜躁人人爽天天天天97| 欧美一性一乱一交一视频| 久久久精品2019中文字幕神马| 一区二区三区视频免费| 日韩电视剧免费观看网站| 欧美亚洲另类制服自拍| 91色琪琪电影亚洲精品久久| 久久亚洲精品国产亚洲老地址| 中文一区二区视频| 国产成人精品免高潮费视频| 亚洲男人的天堂在线播放| 精品国产成人av| 亚洲精品av在线| 久久久久中文字幕| 日韩av一区二区在线| 精品福利一区二区| 久久九九免费视频| 色哟哟亚洲精品一区二区| 久久免费福利视频| 国产精品午夜视频| 久久国产精品免费视频| 久久精品国产96久久久香蕉| 日韩精品中文字幕视频在线| 91精品视频免费| 一区二区福利视频| 91精品国产高清| 2019av中文字幕| 久久久久中文字幕| 日韩欧美成人网| 久久久久久香蕉网| 亚洲理论片在线观看| 一区二区在线免费视频| 欧美自拍大量在线观看| 国产丝袜一区二区| 2025国产精品视频| 欧美日韩国产va另类| 亚洲国产欧美一区二区丝袜黑人| 日韩美女福利视频| 欧美日韩一区二区三区| 国产精品免费一区| 777777777亚洲妇女| 午夜精品福利视频| 高清亚洲成在人网站天堂| 97免费视频在线播放| 国产亚洲美女久久| 最近2019中文免费高清视频观看www99| 操人视频在线观看欧美| 青青草一区二区| 久久久视频免费观看| 久久久久久久久久久成人| 欧美视频二区36p| 日韩欧美大尺度| 91情侣偷在线精品国产| 国产精品视频自拍| 国产精品丝袜久久久久久不卡| 91热福利电影| 精品成人在线视频| 91牛牛免费视频| 91免费欧美精品| 视频在线观看一区二区| 日韩欧美中文免费| 精品国产鲁一鲁一区二区张丽| 日韩视频免费中文字幕| 中文在线不卡视频| 亚洲人成网在线播放| 超碰91人人草人人干| 亚洲跨种族黑人xxx| 欧美性感美女h网站在线观看免费| 色黄久久久久久| 久热爱精品视频线路一| 色与欲影视天天看综合网| 成人久久精品视频| 亚州精品天堂中文字幕| 午夜精品一区二区三区在线视| 久久久最新网址| 久热精品视频在线观看| 国产精品自产拍在线观看中文| 国产精品成人国产乱一区| 日本精品视频在线播放| 久久香蕉国产线看观看网| 久久久欧美一区二区| 欧美三级xxx| 亚洲自拍偷拍网址| 成人黄色中文字幕| 国产mv久久久| 成人av资源在线播放| 91免费看片网站| 亚洲a级在线播放观看| 国产成人在线一区二区| 国语自产精品视频在线看抢先版图片| 国产精品久久久久久久久久久久久久| 亚洲九九九在线观看| 欧美xxxx18性欧美| 精品成人69xx.xyz| 日韩精品极品在线观看播放免费视频| 91亚洲国产成人久久精品网站| 欧美性猛交xxxx久久久| 久久久久久美女| 欧美日韩一区二区三区在线免费观看| 欧美激情一二三| 日本精品性网站在线观看| 精品亚洲va在线va天堂资源站| 欧美日韩成人在线视频| 伊人精品在线观看| 精品无人区太爽高潮在线播放| 欧美成人精品在线观看| 欧美激情按摩在线| 欧美日韩激情小视频| 日韩免费av在线| 日韩成人中文电影| 久久99视频精品| 亚洲天堂男人天堂女人天堂| 国产欧美一区二区白浆黑人| 国产综合色香蕉精品| 日韩亚洲在线观看| 国产日韩欧美日韩| 欧美午夜女人视频在线| 国产综合视频在线观看| 亚洲欧美制服综合另类| 国产精品手机播放| 亚洲专区在线视频| 国内精品久久久久久中文字幕| 欧美日韩激情视频8区| 欧美丰满少妇xxxx| 欧美激情a∨在线视频播放| 日韩欧美亚洲国产一区| 高跟丝袜欧美一区| 欧美性猛交99久久久久99按摩| 中文字幕精品一区二区精品| 欧美激情综合色综合啪啪五月| 欧美在线播放视频|