自定义基类,学习笔记

时间:2019-11-05 02:36来源:编程技术
  ThinkPHP 提供了一个 Model 类,供其余的 Model 进行接二连三。Model 类中是MVC 中的模型类,它是调用 悠久层的上层类。认为那样描述难题重重,不过有如何措施吗?不过,那几个 Model有时

   ThinkPHP 提供了一个 Model 类,供其余的 Model 进行接二连三。Model 类中是 MVC 中的模型类,它是调用 悠久层 的上层类。认为那样描述难题重重,不过有如何措施吗?不过,那几个 Model 有时非常小概满意大家的大器晚成对要求,因而大家供给自定义二个 Model 类出来,然则自定义的 Model 相仿要一而再两次三番 TP 提供的 Model 类,而把大家自定义的 Model 类作为我们项目中的 Model 基类。小编怎么认为笔者在说绕口令,等等...作者有一点点晕。

//TP 恶补ing... 

 

风流浪漫、定义数据表模型

猥琐的要求

1.模型映射

  在行使 Java 的开源项目 JeeSite 时,养成了八个不佳的习贯,习贯给每张表都增添create_by、create_date、update_by、update_date、remarks 和 del_flag 这么多少个字段。要是每张表都有那多少个字段,那么对每张表实行 insert 时都会对以上的字段进行设置,对每张表举行 update 时都会对内部豆蔻年华部分字段进展立异,对每条记下进行 delete 时都其实是对 del_flag 字段进展置位。重复操作超多,一些操作方法被修改。那么,这时就要自定义四个谈得来的 Model 来作为项目标 基类 了,这几个 Model 就担负干上边我说的那个事情了。

要测验数据库是不是健康连接,最直白的秘技正是在脚下调整器中实例化数据表,然后利用 dump 函数输出,查看数据库的链接状态。代码:

 

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

自定义二个 Model

那会儿浏览器输出:

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

图片 1图片 2

  定义代码如下:

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"    }  }
 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     }

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

要是未有提醒错误即为成功。

 

M("User") 正是模型映射,M 函数等于 new Model() ,Model 类是模型的基类,也是数据库操作的基类, "User" 是此类的叁个分子属性,表示模型名称,模型名称与数据库中的数据表举办映射。注意:User "U" 要大写,数据库中当时应当留存一张 user 表,系统会根据计划文件中的设置给 user 表增添前缀,举个例子tpk_user。假诺没有须要为表加多前缀,将模型名称首字母改为小写,举个例子M("user")。

连绵起伏我们定义的基类

 

  世襲的 BaseModel 的主意和持续 Model 的诀假如风流倜傥致的,只是使用 use 引进命名空间到当前服从域时的急需改正为我们的命名空间,并不是再去行使 TP 提供的命名空间。代码如下:

2.自定义模型

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

D 函数用于神速实例化自定义模型,能够张开复杂的数据库操作,譬喻数据印证、数据缓存、数据加工等。自定义模型存放在 Lib/Model 目录下,比方为数量表 tpk_article 数据表建模映射,则必要成立 ArticleModel.class.php,然后使用 D 函数实行实例化,ArticleModel 模型将与 tpk_article 表进行映射。

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

例:使用 select() 输出 tpk_article 表的数据 ( select() 方法用于列出装有切合条件的数据 ) :

 

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

  那样,在我们用 D 方法实例化 TrunkModel 的靶子后,使用 add 方法插入数据时,就能够先调用 BaseModel 中的 add 方法了,那样我们每张表都有个别 create_by 等风流倜傥雨后玉兰片字段就都会自行得到了。

浏览器输出:

图片 3图片 4

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    }  }

 

例2:让 tpk_article 表的内容据说顾客所在的地区展现本地的资源音讯:

ArticleModel.class.php:

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

调节器代码:

IndexAction.class.php:

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

而且视图代码:

TPL/Index/article.html:

<!DOCTYPE html>  <html>  <body>    <volist name="list" id="vo">      <li><{$vo.title}> - <{$vo.area}> - <{$vo.content}></li>  </volist>    </body>  </html>

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

图片 5

小结:自定义模型映射,三个模型对应一个数据表,全数增加和删除改查都在模型类中实现。M 实例化的参数是数据库的表名,D 实例化的是友善在 model 文件夹下创设的模型文件。

 

3.create 方法

TP 对数码的插入和翻新都做了冲天封装:提供了 create() 方法用于制造数量对象。

概念:数据对象 —— 数据字段与数据表之间的涉嫌,数据会被映射为类成员,再与数据表映射,最终实现数量的插入或更新。

create() 方法是贯穿操作、CU牧马人D 操作的集结 ( 包蕴数据创建、数据印证、表单验证、自动实现等 )。

cerate() 的数据源由 POST 表单提供,比方表单中有 username 表单成分,则该因素会被电动映射为多少表中的 username 字段。数据对象成立成功之后,对象被贮存于内部存款和储蓄器中。

例:增添数据

控制器:IndexAction,动作:add_article,代码:

IndexAction.class.php:

<?php  class IndexAction extends Action {        Public function add_article(){            $this->display();      }  }

视图: Tpl/Index/add_article.html:

<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="title" placeholder="标题"><br><br>          <textarea name="content" id="content" placeholder="内容"></textarea><br><br>          <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

__URL__/add 代表近年来调控器的 add 动作。

add 动作代码:

<?php  class IndexAction extends Action {        public function add(){            //表单处理          $articleObj = M('Article');          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }  }

事例截止。

 

4.模子属性( Model )

 _map 属性:字段映射

为了防止前台表单成分与数据库字段名相像而使数据库字段揭露,能够修正前台表单元素的 name,同不常候在 Model 中动用 _map 属性。代码:

视图:Tpl/Index/add_article.html:

<!DOCTYPE html>  <html>  <body>        <form method="post" action="__URL__/add">            <input type="text" name="subject" placeholder="标题"><br><br>          <textarea name="textEdit" id="content" placeholder="内容"></textarea><br><br>           <input type="submit" name="submit" value="提交">        </form>    </body>  </html>

模型:ArticleModel.class.php:

<?php  class ArticleModel extends Model{        //使用_map属性(字段映射)将表单元素映射为相应表字段      protected $_map = array(                    "subject"=>"title",          "textEdit"=>"content"      );    }

控制器:IndexAction.class.php:

<?php    class IndexAction extends Action {            $articleObj = D("Article");          $articleObj->create();          $articleObj->add_time = date("Y-m-d H:i:s",time());          if($articleObj->add()){                        $this->success("数据添加成功");          }else{                        $this->error("数据添加失败");          }  }

事例甘休。

 

二、功底模型

1.连贯操作

贯穿方法除了 select() 方法外,其余的贯通方法不区分前后相继。

例:

$rows=$obj->where("add_user='dee'")->order("add_time desc")->limit(10)->select();

 

2.CURD

① 创造数量 add()

<?php    class IndexAction extends Action {            public function post(){            $articleObj = D("Article");          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['add_time'] = date("Y-m-d H:i:s",time());          if($articleObj->add($data)){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }      }  }

另叁个例证:

<?php    class IndexAction extends Action {            public function post(){            $articleObj = D("Article");          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['add_time'] = date("Y-m-d H:i:s",time());            if($articleObj->data($data)->add()){                $this->success("数据添加成功");          }else{                $this->error("数据添加失败");          }      }  }

 

② 更新数据 save()

<?php    class IndexAction extends Action {      public function post2(){            $articleObj = M("Article");          $data['id'] = 2;          $data['title'] = $_POST['subject'];          $data['content'] = $_POST['textEdit'];          $data['area'] = '河北';          $data['add_time'] = date("Y-m-d H:i:s",time());          if($articleObj->save($data)){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }

 

 

③ 读取数据 select 和 getFiled

getField 例子:

<?php    class IndexAction extends Action {        public function post3(){            $articleObj = M("Article");          if($articleObj->where("id=3")->setField("content","{$_POST['subject']}")){                $this->success("数据修改成功");          }else{                $this->error("数据修改失败");          }      }  }

 

④ 删除数据 delete

<?php    class IndexAction extends Action {            public function delete(){            $articleObj = M("Article");          if($articleObj->where("id=".$_GET['id'])->delete()){                $this->success("数据删除成功");          }else{                $this->error("数据删除失败");          }      }  }

 

3.查询语言

例子:

<?php    class IndexAction extends Action {        public function archives(){            $obj = M("Archives");  //      $data['writer'] = array("eq","网络营销中心");  //      $data['title'] = array("like","精诚%");          $data['id'] = array("lt","100");          $rows=$obj->where($data)->select();            $count=$obj->where($data)->count();          $tb=C("DB_PREFIX");            $this->assign("list",$rows);          $this->assign("count",$count);          $this->assign("tb",$tb);          $this->display("Article");      }            public function archives2(){            $obj = M("Archives");          $data['id'] = array(array("lt","1034"),array("GT","1029"),"and");          $rows=$obj->where($data)->select();          $this->assign("list",$rows);          $this->display("Article");      }  }

 

能够在调节器中选取 echo $obj->getLastSql(); 查看转变后的 SQL 语句。

 

参谋资料:《PHP MVC 开采实战》

 


编辑:编程技术 本文来源:自定义基类,学习笔记

关键词:

  • 上一篇:没有了
  • 下一篇:没有了