• 巔云智能建站平臺搭建版(創業門戶版)火爆上線,終身授權!新增:文章智能采集+全站真靜態打包+城市分站+智能小程序+非法詞過濾+H5自適應+智能鏈詞等功能功能詳情
    建站專提News

    ThinkPHP模型詳解

    一佰互聯網站開發設計(www.karaokedaily.com) 發布日期 2019-04-27 10:45:01 瀏覽數: 154

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

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

    <?phpnamespace HomeModel;use ThinkModel;class UserModel extends Model {}

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

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

      "DB_TYPE"        => "mysql",     "DB_HOST"        => "localhost",   "DB_NAME"        => "database",    "DB_USER"        => "username",     "DB_PWD"        => "password",    "DB_PORT"        => "3306",   

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

    指定數據表前綴

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

    protected $tablePrefix = "top_";

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

    protected $tablePrefix = "";

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

    protected $tableName = "user";

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

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

    protected $tablePrefix = "";

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

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

    protected $tablePrefix = "";protected $tableName = "users";

    或者你直接指定trueTableName:

    protected $trueTableName = "users";

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

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

    public function testDemo()  {  }

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

    添加紀錄

    $user = M("User");$data["username"] = "ThinkPHP";$data["email"] = "ThinkPHP@gmail.com";$user->create($data);$record = $user->add();dump($record);

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

    讀取紀錄

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

    $user = M("User");$record = $user->where("username="ThinkPHP"")->find();dump($record);

    讀取字段值

    $user = M("User");$record = $user->where("id=3")->getField("username");dump($record);

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

    $user = M("User");$record = $user->getField("username,email");dump($record);

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

    $user = M("User");$record = $user->getField("email,username");dump($record);

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

    用save()方法更新數據

    $user = M("User");$data["username"] = "ThinkPHPSave";$data["email"] = "ThinkPHPSave@outlook.com";$record = $user->where("id=3")->save($data);dump($record);

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

    當然,你也可以這樣:

    $user = M("User");$user->username = "ThinkPHP";$user->email = "ThinkPHP@outlook.com";$record = $user->where("id=3")->save();dump($record);

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

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

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

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

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

    $user = M("User");$record = $user->where("id=3")->delete();dump($record);

    或者你可以直接使用:

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

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

    ActiveRecords

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

    $user = M("User");$user->username = "ThinkPHPWithActive";$user->email = "ThinkPHPActive@gmail.com";$record = $user->add();dump($record);

    讀取紀錄

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

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

    $user = M("User");$record = $user->find(2);dump($record);

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

    $user = M("User");$record = $user->getByUsername("jelly");dump($record);

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

    $user = M("User");$record = $user->select("1,3,8");dump($record);

    更新記錄

    $user = M("User");$user->find(21);$user->username = "TOPThinkChangeWithAR";$record = $user->save();dump($record);

    刪除記錄

    刪除單條紀錄

    $user = M("User");$record = $user->delete(8);dump($record);

    刪除多條紀錄

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

    自動完成

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

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

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

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

    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()方法動態設置自動完成的機制,可以到官方文檔去看看

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

    $user = D("User");$data["username"] = "ThinkPHP";$data["email"] = "ThinkPHP@gmail.com";$user->create($data);$record = $user->add();dump($record);

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

    $user = D("User");$record = $user->find(id);dump($record);

    自動驗證

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

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

    通常用于表單驗證

    數據驗證有兩種方式:

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

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

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

    array(     array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),     array(驗證字段2,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),     ......);下面以$_validate靜態方式舉例如何使用自動驗證:

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

    public function register()  {    $this->display();  }

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

    上面就是一些HTML代碼和一點模板的知識,對于模板,我們后續會講到,但不管怎樣,現在我們訪問http://localhost:8999/Home/User/register,就可以看到我們的注冊表單頁面了。

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

    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) )會觸發自動驗證并判斷驗證是否通過驗證。你可以嘗試在表單里填寫不同的數據來進行測試,也可以修改一下驗證規則,更多規則可以到官網查看:

    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 成員變量里面定義,并且可以支持動態定義。要支持關聯操作,模型類必須繼承ThinkModelRelationModel類,關聯定義的格式類似于:

    namespace HomeModel;use ThinkModelRelationModel;class UserModel extends RelationModel{   protected $_link = array(    "關聯" => array(      "關聯屬性1" => "定義",      "關聯屬性N" => "定義",    ),   );}

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

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

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

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

    在UserModel中:

    protected $_link = array(    "Article" => self::HAS_MANY  );

    在ArticleModel中:

    protected $_link = array(    "User" => self::BELONGS_TO  );

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

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

    在UserModel中:

    protected $_link = array(    "mapping_type" => self::HAS_MANY,    "class_name"  => "Article",    "foreign_key"  => "user_identify",  );

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

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

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

    $user = D("User");$record = $user->relation(true)->find(4);dump($record);

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

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

    TAG標簽: ThinkPHP模型詳解  
    一佰互聯是全國知名建站品牌服務商,我們有九年網站建設、網站制作、網頁設計、php開發和域名注冊及虛擬主機服務經驗,提供的自助建站服務更是全國有名。近年來還整合團隊優勢自主開發了可視化多用戶”巔云建站系統“3.0平臺版,拖拽排版網站制作設計,輕松實現pc站、手機微網站、小程序、APP一體化全網營銷網站建設 ,已成功的為全國上百家網絡公司提供自助建站平臺搭建服務。更多資訊:tags標簽

    相關新聞more

    26
    04月
    Yii2實現UploadedFile上傳文件

    閑來無事,整理了一下自己寫的文件上傳類。通過UploadFile::getInstance($model, $attribute);Uplo... >>詳情

    26
    04月
    詳解PHP數據壓縮、加解密(pack, un

    網絡通信、文件存儲中經常需要交換數據,為了減少網絡通信流量、文件存儲大小以及加密通信規則,經常需要對數據進行雙向加解密以保證數據的安全。PH... >>詳情

    11
    04月
    交互大廚的私房書單!10本設計原則的好書幫你

    作品被品評:感覺不對啊。設計師先懵一下,然后不知所措的改啊改,廢寢忘食,一直改到大家都滿意……這個故事每天都在上演。想知道如何擺脫這種困境,... >>詳情

    17
    05月
    網站運營:該如何留住用戶 減少網站跳出率_巔

    留住跳出,提高轉化一直是一個熱點話題,一個只有能真真正正的吸引來并且留住用戶才是完整的,既然是要留用戶,在談留住用戶跳出之前我們先來看看用戶... >>詳情

    高端網站建設

    美工兼顧SEO,為企業電子商務營銷助力!

    電話(微售):

    18581389571
    建站

    產品

    域名注冊 虛擬主機 云服務器 企業郵局
    智能建站 APP打包 微站/小程序 創業平臺
    網站推廣 媒體營銷 智能采集 AI機器人
    400電話 短信營銷 店銷機器人
    私人定制 門戶網站
    溝通客服
    展開
    91小仙女思妍丝袜,免费中文字幕无码视频,黑色丝袜老师自慰喷水动态图