ThinkPHP 3.2 自定义基类 Model

2019-12-01 01:46栏目:龙竞技官网
TAG:

   ThinkPHP 提供了二个 Model 类,供别的的 Model 举行后续。Model 类中是 MVC 中的模型类,它是调用 长久层 的上层类。感到这样描述难题重重,但是有啥办法啊?可是,这么些 Model 一时不大概知足我们的部分要求,由此我们须要自定义一个 Model 类出来,可是自定义的 Model 雷同要继续 TP 提供的 Model 类,而把大家自定义的 Model 类作为我们项目中的 Model 基类。小编怎么以为自身在说绕口令,等等...笔者有一点点晕。

//TP 恶补ing... 

近日比较绕风趣味地上学PHP,看完了有个别根基语法、学会了利用SMALANDY模版,继而看了ThinkPHP框架,

 

黄金年代、定义数据表模型

此框架的有力超过作者的意想不到,它的ROTiguan真是强,还可能有内置的CRUD,比JAVA的框架更智能。

猥琐的必要

1.模子映射

便利回想性的上学转发了豆蔻年华部分以下小说

  在应用 Java 的开源项目 JeeSite 时,养成了一个糟糕的习贯,习于旧贯给每张表都增添create_by、create_date、update_by、update_date、remarks 和 del_flag 这么多少个字段。如若每张表都有那多少个字段,那么对每张表进行 insert 时都会对上述的字段实行安装,对每张表进行 update 时都会对内部有些字段实行更新,对每条记下进行 delete 时都其实是对 del_flag 字段进展置位。重复操作比超多,一些操作方法被涂改。那么,那时将在自定义三个和睦的 Model 来作为项指标 基类 了,这一个 Model 就担当干上面我说的那一个事情了。

要测量检验数据库是不是通常连接,最直白的秘技正是在当下调整器中实例化数据表,然后接收dump 函数输出,查看数据库的链接状态。代码:

CU途胜D知识之意气风发 C 创制(create卡塔尔

 

public function testdb(){        $obj=M("User");      dump($obj);  }

名词剖判:
1  CURD:意味着数据库多少个基本操作:成立:create,更新:update,读取:read,删除:delete

自定义八个 Model

那会儿浏览器输出:

2  模型对象:即数据对象,你项目里每三个Model类文件都会对应着贰个数据表(或者视图卡塔尔,模型与数码表存在大器晚成种炫彩关系。TP约定了命名要依据一定的正规化,假诺不符合,则要求依据事态开展额外的对应设置。比如Model类的tableName属性

  自定义二个 Model,Model 中起码重新 TP 提供的 Model 中的 add、save、delete 和 select 方法。

图片 1图片 2

在第3节时,曾略为涉及Model类文件命名,今后再回想一下这有的的剧情:
我们早前在数据库中,已确立了二个think_form数据库表,何况在布置文件config.php中,大家定义了数据表的前缀是think_,
模型类(Model)文件的命名法规是:

  定义代码如下:

object(Model)#5 (20) {    ["_extModel:private"] => NULL    ["db:protected"] => object(DbMysql)#7 (18) {      ["dbType:protected"] => string(5) "MYSQL"      ["autoFree:protected"] => bool(false)      ["model:protected"] => string(7) "_think_"      ["pconnect:protected"] => bool(false)      ["queryStr:protected"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      ["modelSql:protected"] => array(1) {        ["user"] => string(28) "SHOW COLUMNS FROM `tpk_user`"      }      ["lastInsID:protected"] => NULL      ["numRows:protected"] => int(2)      ["numCols:protected"] => int(0)      ["transTimes:protected"] => int(0)      ["error:protected"] => string(0) ""      ["linkID:protected"] => array(1) {        [0] => resource(27) of type (mysql link)      }      ["_linkID:protected"] => resource(27) of type (mysql link)      ["queryID:protected"] => resource(28) of type (mysql result)      ["connected:protected"] => bool(true)      ["comparison:protected"] => array(10) {        ["eq"] => string(1) "="        ["neq"] => string(2) "<>"        ["gt"] => string(1) ">"        ["egt"] => string(2) ">="        ["lt"] => string(1) "<"        ["elt"] => string(2) "<="        ["notlike"] => string(8) "NOT LIKE"        ["like"] => string(4) "LIKE"        ["in"] => string(2) "IN"        ["notin"] => string(6) "NOT IN"      }      ["selectSql:protected"] => string(96) "SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%"      ["bind:protected"] => array(0) {      }    }    ["pk:protected"] => string(2) "id"    ["tablePrefix:protected"] => string(4) "tpk_"    ["name:protected"] => string(4) "user"    ["dbName:protected"] => string(0) ""    ["connection:protected"] => string(0) ""    ["tableName:protected"] => string(0) ""    ["trueTableName:protected"] => string(8) "tpk_user"    ["error:protected"] => string(0) ""    ["fields:protected"] => array(5) {      [0] => string(2) "id"      [1] => string(8) "username"      ["_autoinc"] => bool(true)      ["_pk"] => string(2) "id"      ["_type"] => array(2) {        ["id"] => string(7) "int(11)"        ["username"] => string(11) "varchar(20)"      }    }    ["data:protected"] => array(0) {    }    ["options:protected"] => array(0) {    }    ["_validate:protected"] => array(0) {    }    ["_auto:protected"] => array(0) {    }    ["_map:protected"] => array(0) {    }    ["_scope:protected"] => array(0) {    }    ["autoCheckFields:protected"] => bool(true)    ["patchValidate:protected"] => bool(false)    ["methods:protected"] => array(13) {      [0] => string(5) "table"      [1] => string(5) "order"      [2] => string(5) "alias"      [3] => string(6) "having"      [4] => string(5) "group"      [5] => string(4) "lock"      [6] => string(8) "distinct"      [7] => string(4) "auto"      [8] => string(6) "filter"      [9] => string(8) "validate"      [10] => string(6) "result"      [11] => string(4) "bind"      [12] => string(5) "token"    }  }

不饱含前缀的数据库表表名还要首字母大写+Model.class.php

 1 <?php
 2 namespace AdminModel;
 3 use ThinkModel;
 4 
 5 /**
 6  * 项目中其他 Model 类的基类
 7  * 该类继承自 TP 提供的基类 Model
 8  */
 9 class BaseModel extends Model {
10     
11     /**
12      * 继承基类 Model 的 add 方法
13      * 自动插入 id create_by create_date update_by update_date del_flag
14      */
15     public function add($data='',$options=array(),$replace=false) {
16         
17         $data["id"]          = $this->getUuid();
18         $data["create_by"]   = "";
19         $data["create_date"] = date("Y-m-d H:i:s");
20         $data["update_by"]   = "";
21         $data["update_date"] = date("Y-m-d H:i:s");
22         $data["del_flag"]    = '0';
23         
24         return parent::add($data, $options, $replace);
25     }
26     
27     /**
28      * 获得 未删除 的所有数据
29      * 记录是否被删除通过 del_flag 字段来进行确定
30      */
31     public function select($options=array()) {
32         $map["del_flag"] = 0;
33         $this->where($map);
34         
35         return parent::select($options);
36     }
37     
38     /**
39      * 获取 全部 的所有数据
40      */
41     public function selectAll($options=array()) {
42         return parent::select($options);
43     }
44     
45     /**
46      * 更新数据
47      * 更新数据时,要更新 update_by update_date 两个字段
48      */
49     public function save($data='',$options=array()) {
50         $data["update_by"]   = "";
51         $data["update_date"] = date("Y-m-d H:i:s");
52         
53         return parent::save($data, $options);
54     }
55     
56     /**
57      * 删除也是更新
58      * 设置 删除 标志位即可
59      */
60     public function delete($data='',$options=array()) {
61         $data["del_flag"] = 1;
62         
63         return parent::save($data, $options);
64     }

之所以前面我们为think_form数据表在Myapp/Lib/Model目录下树立多个文本FormModel.class.php

  那样,我们的 BaseModel 就定义好了,今后项目中的 Model 就不再接续 TP 的 Model 类了,而是继续大家自定义的 BaseModel 了。

借使未有提示错误即为成功。

模型类的奇特命名还足以智能识别驼峰式的表命名,假若大家有个是雷同think_new_table那样的表
能够命名称叫NewTableModel.class.php。默认配置便能够智能识别自动对应think_new_table表,因而不要改善配置。

 

M("User"卡塔尔(英语:State of Qatar) 正是模型映射,M 函数等于 new Model(卡塔尔(قطر‎ ,Model 类是模型的基类,也是数据库操作的基类, "User" 是此类的三个分子属性,表示模型名称,模型名称与数据库中的数据表进行映射。注意:User "U" 要大写,数据库中那时应当留存一张 user 表,系统会依照安排文件中的设置给 user 表增加前缀,举例tpk_user。要是没有供给为表增多前缀,将模型名称首字母改为小写,举个例子M("user"卡塔尔(قطر‎。

支付进程中,只要轻松地定义好与数据表对应的模型类(xxxModel.class.php),就可以打开对数据操作了。
怎样让这些模型支撑活动验证,自动填充,自动过滤那几个知识,在下边涉及届时会作相应讲明。

接轨大家定义的基类

 

诚如的话,在表中添增加少都以通过表单来确立,为了更加直观地球科学习CULANDD中的C,大家接下去构造建设个表单来实行增多数据的操作。
事情发生前大家已在Myapp/Lib/Model/下树立好FormModel.class.php类----模型(M卡塔尔(英语:State of Qatar)
再者也在Myapp/Lib/Action/下增加了多少个Index应用模块和写下了叁个index操作----调节器(C)
何况在Tpl目录下树立了与之相应的模板目录Index及index.html模板文件 -------视图(V)
MVC情势的开辟已反映了出来。
tdweb曾简要地满含了TP中那三者的涉嫌,

  继承的 BaseModel 的格局和后续 Model 的方法是相符的,只是使用 use 引进命名空间到日前功用域时的内需更改为大家的命名空间,并非再去行使 TP 提供的命名空间。代码如下:

2.自定义模型

C的功用,就是从M中获得数据到V,

1 <?php
2 namespace AdminModel;
3 use AdminModelBaseModel;
4 
5 class TrunkModel extends BaseModel {

D 函数用于火速实例化自定义模型,能够展开复杂的数据库操作,比方数据印证、数据缓存、数据加工等。自定义模型寄放在 Lib/Model 目录下,比如为数据表 tpk_article 数据表建模映射,则需求创制 阿特icleModel.class.php,然后选用 D 函数举办实例化,ArticleModel 模型将与 tpk_article 表实行映射。

使用TP以表单提交数据到库,流程和您所通晓的表单提交没有啥分别,只是TP简化了数量操作的管理进程。
我们在实操中体味一下。
先来走访我们所定义的数量表form的字段:

  use 引进的命名空间是 AdminModelBaseModel ,因为大家定义的 BaseModel 的命名空间是 AdminModel,因为那边的 TrunkModel 和 BaseModel 在三个命名空间下,省去 use 也是足以的。

例:使用 select() 输出 tpk_article 表的数据 ( select()方法用于列出富有切合条件的数据 卡塔尔(英语:State of Qatar) :

  1. 'id',//自动编号
  2. 'title',//标题
  3. 'content',//内容
  4. 'create_time',//创制时间
  5. 'update_time'//更新时间
  6. 'email',//邮箱
  7. 'status',//状态

 

class IndexAction extends Action {          public function article(){        $obj=D("Article");      $rows=$obj->select();                  dump($rows);     }  }

复制代码

  这样,在大家用 D 方法实例化 TrunkModel 的指标后,使用 add 方法插入数据时,就能够先调用 BaseModel 中的 add 方法了,那样我们每张表都有的 create_by 等风流罗曼蒂克多元字段就都会活动获取了。

浏览器输出:

其中的create_time字段是为着记录数据插入的时日,大家得以选择TP的数额自动填充来处理。

图片 3图片 4

在Model类定义 $_auto 属性,能够做到数据自动管理功用,用来拍卖默许值和其余 onclick="tagshow(event卡塔尔国">系统写入字段。
注意1:该活动填写大概会覆盖表单提交项目。其指标是为着幸免表单非法提交字段。
专心2:要动用Model类的create方法成立数量对象的时候才会自行实行表单数据管理。

array(6) {    [0] => array(7) {      ["id"] => string(1) "1"      ["title"] => string(4) "test"      ["content"] => string(12) "test_content"      ["category"] => string(13) "test_category"      ["area"] => string(6) "北京"      ["add_user"] => string(5) "admin"      ["add_time"] => string(19) "2014-11-20 23:03:44"    }    [1] => array(7) {      ["id"] => string(1) "2"      ["title"] => string(12) "吼吼吼吼"      ["content"] => string(18) "任溶溶柔然人"      ["category"] => string(14) "test_category2"      ["area"] => string(6) "河北"      ["add_user"] => string(5) "admin"      ["add_time"] => string(19) "2014-11-22 15:16:12"    }    [2] => array(7) {      ["id"] => string(1) "4"      ["title"] => string(7) "test2_m"      ["content"] => string(4) "haha"      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => string(19) "2014-11-22 11:44:26"    }    [3] => array(7) {      ["id"] => string(1) "5"      ["title"] => string(2) "22"      ["content"] => NULL      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => string(19) "2014-11-22 12:40:58"    }    [4] => array(7) {      ["id"] => string(1) "6"      ["title"] => string(1) "1"      ["content"] => string(1) "2"      ["category"] => string(0) ""      ["area"] => string(6) "福建"      ["add_user"] => NULL      ["add_time"] => NULL    }    [5] => array(7) {      ["id"] => string(1) "7"      ["title"] => string(6) "lalala"      ["content"] => string(6) "hohoho"      ["category"] => string(0) ""      ["area"] => string(6) "北京"      ["add_user"] => NULL      ["add_time"] => NULL    }  }

1 张开Myapp/Lib/Model/FormModel.class.php文件,更正代码为

  1. <?php
  2. class FormModel extends Model {
  3. // 自动填写设置
  4. protected $_auto  =  array(
  5.   array('status','1','ADD'),
  6.         array('create_time','time','ADD','function'),
  7. );
  8. }
  9. ?>

 

代码知识要点:
Model类的$_auto属性由七个填充因子组成的数组,填充因子定义格式:

例2:让 tpk_article 表的故事情节听大人讲客商所在的地带展现本地的音信:

array(填充字段,填充内容,填充条件,附加法规卡塔尔

ArticleModel.class.php:

填充字段:正是内需开展拍卖的表单字段,那些字段并不应该假设数据库表中的字段,对于表单内的增派检查实验字段比方重复密码和验证码也得以处理。
填充条件:ADD | UPDATE | ALL(注意,此是1.5本子表明,1.6已改为1 2 3,后续教程有认证卡塔尔(英语:State of Qatar)
当为ADD时,会在疯长多少时自动填充,那是暗中认可的管理方式
当为UPDATE时,在改良数据的时候会自动填写
当为ALL时,全体意况下都会开展机动填写

<?php  class ArticleModel extends Model{            public function article(){                $rows=$this->where("area='{$this->checkUserArea()}'")->select();          return $rows;      }        protected function checkUserArea(){                return "北京";          }

叠合法则:叠合准则是针对填充内容来讲,表示该内容填充的办法,蕴含function,callback,田野先生,string
对于田野先生使用别的字段进行填空和string直接标示字符串作为值进行填写很好明白。举例地方

调整器代码:

  1. array('status','1','ADD'),

IndexAction.class.php:

复制代码

<?php  class IndexAction extends Action {        $obj=D("Article");      $rows=$obj->article();      $this->assign("list",$rows);      $this->display();

即使将状态status字段的值直接以1填充.

还要视图代码:

下边首要说说function与callback这多少个附加法则。

TPL/Index/article.html:

  1. protected $_auto  =  array(
  2. array('create_time','time','ADD','function'),
  3. );
<!DOCTYPE html>  <html>  <body>    <volist name="list" id="vo">      <li><{$vo.title}> - <{$vo.area}> - <{$vo.content}></li>  </volist>    </body>  </html>

上面create_time代表了要拍卖的字段,填充内容是time,附加准则是function使用函数,填充条件是ADD新增加时管理,那么整行代码表示对create_time字段在新扩展的时候使time函数作为该字段的值举办机动填写。
再看叁个function作为附加准则的例子

附:数据表 tpk_article 的表构造为:

  1. protected $_auto  =  array(
  2. array('password','md5','ADD','function'),
  3. );

版权声明:本文由龙竞技官网发布于龙竞技官网,转载请注明出处:ThinkPHP 3.2 自定义基类 Model