ThinkPHP5模型实例详解 / 创建模型对象

创建模型对象

模型对象

1.定义:特定数据表字段信息的对象描述;

从定义可以分析出二点:

  1. 数据表的描述与模型定久是绑定的;
  2. 数据表的字段与模型对象的属性是绑定的;

2. 步骤:

  1. 创建与数据表对应的模型类;
  2. 控制器进行调用;

3. 实例. 创建与tp5_staff数据表的模型类

  1. 创建tp5_staff数据表
  • staff数据表结构如下:
序号 字段名 类型 宽度 约束 默认值 备注
1 id 整型 4位 无符号、不为空、自增、主键 编号
2 name 变长字符串 30位 不为空 姓名
3 sex 整型 1位 不为空 1 性别1男0女
4 salary 浮点型 共10位小数2位 无符号、不为空 2000 工资
5 dept 变长字符串 20位 不为空 开发部 部门
6 hiredate 日期 默认 不为空 0000-00-00 入职日期
  • 创建语句如下:
CREATE TABLE IF NOT EXISTS  staff (
id INT(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号',
name VARCHAR(30) NOT NULL    COMMENT '姓名',
sex TINYINT(2)  unsigned  NOT NULL  DEFAULT 1  COMMENT '性别1男0女',
salary FLOAT(10,2) NOT NULL DEFAULT 2000.00 COMMENT '工资',
dept VARCHAR(20)  NOT NULL  DEFAULT '开发部' COMMENT '部门' ,
hiredate DATE  NOT NULL  DEFAULT '0000-00-00' COMMENT '入职日期',
PRIMARY KEY (id)
)ENGINE = MyISAM DEFAULT CHARSET = utf8  AUTO_INCREMENT = 1001;
  1. 针对该表创建与之对应的模型类:
  • 第一步:创建模型类:Staff.php
    • 在应用目录application的Index模块下创建model目录,用来存放模型类文件
    • 在/application/index/model/目录下创建:Staff.php:
<?php
namespace app\index\model;

//导入模型类
use think\model;

//定义类Staff,继承model类
class Staff extends model {
    //此处是自定义模型类代码,目前为空
    }    
}

model类是抽象类,必须由子类继承后才可以使用。

“就这么简单,模型创建成功了!”

  • 第二步: 下面演示如何调用这个模型类Staff:

    • 创建控制器Index.php:
<?php
namespace app\index\controller;

//导入模型类
use app\index\model\Staff;

class Index {
  public function index(){ 

      //创建模型类Staff
      $model = new Staff();

      //查看Staff类实例$model
      dump($model);

  }
}
  • 第三步: 测试模型对象Staff

    • 浏览器访问这个控制器: tp5.com/index.php/index/index/index/

    • Staff类实例:$model对象内容如下:

      为教学方便,部分注释比源码要详细

//该对象共计有28个受保护属性,必须在本类或子类中使用,外部不能直接使用
object(app\index\model\Staff)#5 (28) {

  //数据库配置数组
  ["connection":protected] => array(0) {
  }

  //数据库查询对象,负责最终完成对数据库的操作
  ["query":protected] => NULL

  //模型名称 ,创建时自动赋值
  ["name":protected] => string(5) "Staff"

  //与模型绑定的数据表的完整名称(包括前缀的表名,如:tp5_staff)
  ["table":protected] => NULL

  //用命名空间表示的、当前的模型类名:Staff
  ["class":protected] => string(21) "app\index\model\Staff"

  //出错时显示的信息
  ["error":protected] => NULL

  //字段验证规则
  ["validate":protected] => NULL

  //数据表主键
  ["pk":protected] => NULL

  //数据表字段名列表(与数据表对应)
  ["field":protected] => array(0) {
  }

  //只读字段列表
  ["readonly":protected] => array(0) {
  }

  //显示字段列表
  ["visible":protected] => array(0) {
  }

  //隐藏属性字段列表
  ["hidden":protected] => array(0) {
  }

  //追加属性列表
  ["append":protected] => array(0) {
  }

  //与数据表字段对应的信息列表(极其重要)
  ["data":protected] => array(0) {
  }

  //字段修改信息列表
  ["change":protected] => array(0) {
  }

  //自动完成列表
  ["auto":protected] => array(0) {
  }

  //新增自动完成列表
  ["insert":protected] => array(0) {
  }

  //更新自动完成列表
  ["update":protected] => array(0) {
  }

// 是否需要自动写入时间戳 如果设置为字符串 则表示时间字段的类型
  ["autoWriteTimestamp":protected] => bool(false)

  //设置表中:创建时间字段的名称
  ["createTime":protected] => string(11) "create_time"

    //设置表中:更新时间字段的名称
  ["updateTime":protected] => string(11) "update_time"

    //设置表中:时间字段的格式
  ["dateFormat":protected] => string(11) "Y-m-d H:i:s"

  //数据表中各字段类型定义
  ["type":protected] => array(0) {
  }

  //是否是:更新操作
  ["isUpdate":protected] => bool(false)

  //更新条件
  ["updateWhere":protected] => NULL

  //当前执行的关联条件
  ["relation":protected] => NULL

  //验证失败是否抛出异常
  ["failException":protected] => bool(false)

  //全局查询范围设置
  ["useGlobalScope":protected] => bool(true)
}

4. 总结:

  1. 目前创建的模型虽然按相关规则,已经与特定数据表绑定了,但是该类的绝大多数属性的值,仍处于默认或不确定状态;
  2. 现在该模型中有二个属性值是确定的:
    • $name //模型名称
    • $class //模型类命名空间,即如何找到这个类
  3. 其它的属性值,在创建数据对象时,会自动获取。