一、定义数据表模型

1.模型映射

要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态。代码:

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

此时浏览器输出:

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

http://127.0.0.26/index.php/index/testdb

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

如果没有提示错误即为成功。

M("User") 就是模型映射,M 函数等于 new Model() ,Model 类是模型的基类,也是数据库操作的基类, "User" 是该类的一个成员属性,表示模型名称,模型名称与数据库中的数据表进行映射。注意:User "U" 要大写,数据库中此时应该存在一张 user 表,系统会根据配置文件中的设置给 user 表添加前缀,例如 tpk_user。如果不需要为表添加前缀,将模型名称首字母改为小写,例如 M("user")。

2.自定义模型

D 函数用于快速实例化自定义模型,可以进行复杂的数据库操作,比如数据检验、数据缓存、数据加工等。自定义模型存放在 Lib/Model 目录下,例如为数据表 tpk_article 数据表建立模型映射,则需要创建 ArticleModel.class.php,然后使用 D 函数进行实例化,ArticleModel 模型将与 tpk_article 表进行映射。

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

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

浏览器输出:

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

http://127.0.0.26/index.php/index/article

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 的表结构为:

总结:自定义模型映射,一个模型对应一个数据表,所有增删改查都在模型类中完成。M 实例化的参数是数据库的表名,D 实例化的是自己在 model 文件夹下建立的模型文件。

3.create 方法

TP 对数据的插入和更新都做了高度封装:提供了 create() 方法用于创建数据对象。

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

create() 方法是连贯操作、CURD 操作的集合 ( 包括数据创建、数据检验、表单验证、自动完成等 )。

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:

<?phpclass 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()

<?phpclass 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("数据添加失败");}}
}

另一个例子:

<?phpclass 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()

<?phpclass 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 例子:

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

④ 删除数据 delete

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

3.查询语言

例子:

<?phpclass 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 开发实战》

ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )相关推荐

  1. mysql 字段操作_Mysql:数据库操作、数据表操作、字段操作整理

    mysql 登录本机 mysql -u root -p password 数据库操作 创建数据库 命令:create database 例如:mysql> create database xhk ...

  2. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码

    jsp与javabean链接mysql数据库并查询数据表的简单实例源码.这个简单的实例是给新手学习的,或者一些高手临时忘记怎么使用jsp操作mysql数据库时候查找的,包括了建立mysql数据库连接的 ...

  3. 如何重新创建mysql数据库_重新创建数据库与数据表《 MySQL 基础 》

    前面我们介绍的一些 sql 的语句是 sql 的 ddl 的部分,也就是定义数据结构用的 ... 在接下来的视频里,我们会去看一下 sql 的另一个部分,也就是 dml ,关于数据的操作的部分 ... ...

  4. mysql创建数据库schooldb_MySQL 创建数据表

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...

  5. android手动创建数据表,Android开发—数据库应用—手动创建(SQLite)数据库--手动创建数据表(table)...

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:数据库应用-手 ...

  6. 开源物联网平台ThingsBoard数据库40张数据表设计一览

    开源物联网平台ThingsBoard数据库40张数据表设计一览 1 ThingsBoard数据库总览 1.1 数据库信息 1.1.1 数据库名称 1.1.3 数据库用户名及密码 1.1.3 数据库表 ...

  7. 在MySql数据库中创建数据库dbjava,数据表book,字段包括bno,bname,price,count(编号、书名、单价、数量)。 利用JDBC连接数据库dbjava,实现数据表的增删 改查

    题目 1.在MySql数据库中创建数据库dbjava,数据表book,字段包括bno,bname,price,count(编号.书名.单价.数量). 2.利用JDBC连接数据库dbjava,实现数据表 ...

  8. 共享数据库、共享数据表

    共享数据库.共享数据表:即租户共享同一个Database,同一套数据库表(所有租户的数据都存放在一个数据库的同一套表中).在表中增加租户ID等租户标志字段,表明该记录是属于哪个租户的. 优点:所有租户 ...

  9. mysql之创建数据库,创建数据表

    写在前面 项目中用到mysql数据库,之前也没用过mysql,今天就学下mysql的常用的语法,发现跟sql server的语法极其相似.用起来还是蛮简单的. 一个例子 1.创建一个名为School的 ...

最新文章

  1. 检查Lync SRV记录是否正常
  2. 数据库MySQL关系模型之基本概念
  3. [云炬创业学笔记]第二章决定成为创业者测试2
  4. 多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用
  5. (五)Qt实现自定义模型基于QAbstractItemModel
  6. 【转载】推荐系统的十大挑战
  7. Spring main方法中怎么调用Dao层和Service层的方法
  8. 190521每日一句
  9. 定时器控制一个ADC实现双通道采样(TIM+ADC+DMA)
  10. php判断号码归属,PHP验证手机号码和查询归属地查询的代码
  11. Office2016 Excel的VBA打开显示内存溢出
  12. [转]Facebook 如何存储150亿张、1.5PB的照片
  13. (附源码)计算机毕业设计SSM旅游推广系统
  14. BZOJ 2565 最长双回文串 Manacher
  15. 微信商城店铺怎么开通
  16. Neuroink脑计算机的未来展现了什么
  17. Cadence IC 617 虚拟机添加工艺库教程
  18. 2014多校联合-第八场
  19. 易中天品三国--要点记录
  20. 【python @ 小甲鱼网课】 P6列表(1)

热门文章

  1. C++Wiggle Sort摆动排序的实现算法(附完整源码)
  2. C++ 循环链表circular linked list实现算法(附完整源码)
  3. C++实现chaining链式算法(附完整源码)
  4. C语言用warshall算法求传递闭包transitive closure(附完整源码)
  5. QT的QWinTaskbarButton类的使用
  6. B01_NumPy Ndarray对象(ndarray内容结构,参数,多维,最小维度,dtype参数)
  7. 字符串操作(拷贝,比较,拼接等函数)
  8. 我的世界java和网易能联机吗_网易我的世界单机怎么转联机
  9. 如何使用Soft-NMS实现目标检测并提升准确率
  10. Windows下配置R-FCN