[TOC] # 说明 模型内置的查询和事务支持已经非常强大,而且完全可以使用数据库的查询构造器,也就是说`Db`类的所有功能模型都有,而且模型还提供了诸如自动时间戳、获取器、修改器、搜索器、模型关联及模型事件等功能,而且对象化操作的优势明显。 模型和数据表是一一对应的,一个模型对象对应一个数据表,而一个模型对象实例则对应数据表的一行数据。 以上解释是由TP官方文档复制而来,所以这里并不会过多去说明模型是什么以及模型的基础用法,官方文档中本来就有的,这里也不会去重复说明。 TP6模型主要支持功能列表: [定义](https://www.kancloud.cn/manual/thinkphp6_0/1037580) [模型字段](https://www.kancloud.cn/manual/thinkphp6_0/1037581) [新增](https://www.kancloud.cn/manual/thinkphp6_0/1037582) [更新](https://www.kancloud.cn/manual/thinkphp6_0/1037583) [删除](https://www.kancloud.cn/manual/thinkphp6_0/1037584) [查询](https://www.kancloud.cn/manual/thinkphp6_0/1037585) [查询范围](https://www.kancloud.cn/manual/thinkphp6_0/1037586) [JSON字段](https://www.kancloud.cn/manual/thinkphp6_0/1037587) [获取器](https://www.kancloud.cn/manual/thinkphp6_0/1037588) [修改器](https://www.kancloud.cn/manual/thinkphp6_0/1037589) [搜索器](https://www.kancloud.cn/manual/thinkphp6_0/1037590) [数据集](https://www.kancloud.cn/manual/thinkphp6_0/1037591) [自动时间戳](https://www.kancloud.cn/manual/thinkphp6_0/1037592) [只读字段](https://www.kancloud.cn/manual/thinkphp6_0/1037593) [软删除](https://www.kancloud.cn/manual/thinkphp6_0/1037594) [类型转换](https://www.kancloud.cn/manual/thinkphp6_0/1037595) [模型输出](https://www.kancloud.cn/manual/thinkphp6_0/1037597) [模型事件](https://www.kancloud.cn/manual/thinkphp6_0/1037598) [模型关联](https://www.kancloud.cn/manual/thinkphp6_0/1037599) 系统既然是基于TP6进行开发,所以官方中的说明、功能、使用方式都支持。即使系统有些地方有些个性化处理,但都是基于TP6本身而来的。 # 创建 ## 继承关系 ![](https://img.kancloud.cn/ba/7d/ba7d4a00b498c5e966b7775b7b6fd7ef_1293x182.png) 模型最终都是继承自`think\Model`,这就完全符合了TP6框架本身的要求。 具体模型也都继承到了`woo\common\Model`,因此woo提供的封装方法,你也都可以使用。 `app\common\model\App`你可以找到该文件,里面是空的。这个文件是用于**开发者定义自己的一些公共模型方法**的。 模型都建议放置到`app\commom\model`中,当然你可以定义到其他应用中,都建议按上面的继承关系来,你自定义的模型类都继承到`app\common\model\App`。 模型你可以使用系统后台系统的自动创建([如何使用系统的自动创建](https://www.kancloud.cn/laowu199/e_dev/1957925)?),它会自行识别判断继承关系,也可以自行用其他方式创建(应该很少吧?哈哈哈)。 这里就不复制一个模型代码出来了,你自行在`app\common\model`下找模型看下。 使用系统自动创建的模型文件会在每次后台操作该模型数据或模型字段的时候自动生成覆盖,因此**不要直接在该文件中写自定义代码**(除非开发完成以后,可以确保该模型文件不会被重新生成,否则你的代码会很容易被覆盖而丢失掉),需要改变里面的代码都需要后台操作来自动重新生成。 可以将“/config/woo.php”配置文件下的`is_model_backup`配置项设置为true,每次生成会备份原文件,防止代码完全丢失。由于开发的时候生成比较频繁,系统默认不会备份。 每个模型都会有一个trait文件专门用于写自定义代码的,该文件只会第一次生成,后期不会重新生成被覆盖。 `afterStart`方法中可以获取到所有初始属性数据,在这里面实现数据的一些自定义操作。 也可以在该文件定义该模型的一些方法,便于其他地方调用。 ## 模型属性 ### `$relationLink`:用于定义模型关系(woo) public array ~~~ public $relationLink = [ 'AdminGroup' => [ 'type' => 'belongsTo', ], 'Department' => [ 'type' => 'belongsTo', ], 'AdminLogin' => [ 'type' => 'hasMany', ], ]; ~~~ 详细介绍,可以看下后面的“关联”章节 ***** ### `$form`:用于定义字段的表单、列表、搜索、选项等属性(woo) public array ~~~ public $form = [ 'id' => [ 'type' => 'integer', 'name' => 'ID', 'elem' => 'hidden', ], 'username' => [ 'type' => 'string', 'name' => '用户名', 'elem' => 'text', 'list' => [ 'minWidth' => '100', ], 'list_filter' => true, ], ] ~~~ form属性名可能容易造成歧义(继承了老版的习惯,命名为form),它叫fieldsList可能更加形象;新版中它其实保存了每个字段的详细信息。 ***** ### `$formGroup`:用于定义模型表单分组(woo) public array ~~~ public $formGroup = [ 'basic' => '基本信息',// 必须有basic 'gaoji' => '高级选项', 'else' => '其他设置', ] ~~~ ***** ### `$formTrigger`:定义模型表单触发器(woo) public array ~~~ public $formTrigger = [ 'title' => [ 'a' => 'aa|bb', 'b' => 'aa|cc|dd', ], ]; ~~~ 表示当title字段的值为a时,才显示aa、bb2个字段;当title字段的值为b时,才消失aa、cc、dd3个字段 ### `tableTab`:定义模型表格列表的相关属性(woo) public array 使用Table构建器的时候,可以自动获取该属性来识别列表列表tab、字段、按钮、搜索、侧边栏等 ~~~ public $tableTab = [ // tab名,必须有一个basic 'basic' => [ 'title' => '全部数据',//tab名 //'model' => '',当前Tab对应数据的模型名,默认为当前模型 'url' => '',//数据接口地址 默认当前url // 当前Tab需要显示的字段 不设置自动从form属性list属性识别 'list_fields' => [ 'title', 'is_verify', 'image', 'create_time' ], //'list_filters' => 当前Tab的搜索规则 不设置自动从form属性list_filter键识别 //'tool_bar' => 列表toolBar按钮定义 自定义头部按钮 系统会自动设置新增等操作 //'item_tool_bar' => 列表项目toolBar按钮定义 系统会自动设置修改、删除等操作 // 'siderbar' => ['foreign' => 'Demo'] 列表指定一个 侧边栏模型 模型对应关联字段建议不要是list_filters中得字段,会搜索冲突 // 'checkbox' => 列表复选框操作 checkbox 默认 复选框、 radio 单选框、false 不显示 // 'table' => [] 自定义更多表格的基本参数 // ... ], 'test' => [ 'title' => 'Tab名' ] ]; ~~~ ### `$parentModel`:定义模型的父模型名(woo) public string ### `$cname`:定义模型的中文名(woo) public string ### `$display`:定义模型的主显字段名(woo) public string 默认是主键字段名,比如文章,主显字段一般是标题 ### `$orderType`:定义模型的默认排序方式(woo) public string [DESC|ASC] 有点表希望默认倒序,有点表希望默认正序;通过它来定义 ### `$error`:保存错误信息(woo) protected array ### 时间戳 ~~~ protected $autoWriteTimestamp = 'int'; ~~~ 系统默认已经开启了时间戳功能,而且类型是`int`类型;所有你数据表中时间戳字段名都应该是`int`型。 ![](https://img.kancloud.cn/3c/74/3c74d9e73a1bcfb11926429041bb4e4a_655x403.png) 你在创建模型的时候,需要哪些时间戳功能,勾选上对应字段,自动识别开启;无需你做其他事情。 #### `$createTime` 创建时间(TP) ~~~ protected $createTime = false; ~~~ 默认关闭 如果你的form属性中含有`create_time`字段,系统会自动帮你开启 #### `$updateTime` 最后修改时间(TP) ~~~ protected $updateTime = false; ~~~ 默认关闭 如果你的form属性中含有`update_time`字段,系统会自动帮你开启 #### `$deleteime` 软删除,删除时间(TP) ~~~ protected $deleteTime = false; ~~~ 默认关闭 如果你的form属性中含有`delete_time`字段,系统会自动帮你开启;删除的时候自动就是软删除 ### `$customData ` 自定义模型数据(woo) public array ~~~ public $customData = []; ~~~ ### `$isForceDelete` 是否是真删除(woo) protected boolean 在删除的模型事件中,通过该属性判断当前操作是真删除,还是软删除。 ### `$treeLevel` 无限级模型中 记录最多允许的级数(woo) protected int ~~~ protected $treeLevel = 0; ~~~ ### `$validate` 模型自动验证规则(woo) ~~~ $this->validate = [ 'username' => [ [ 'rule' => ['require'], ], [ 'rule' => ['unique', 'admin'], ], ], 'password' => [ [ 'rule' => ['require'], 'on' => 'add', ], [ 'rule' => ['length', '6,16'], ], ], ]; ~~~ ### TP框架自有属性 #### `$pk` 主键字段 ~~~ protected $pk = 'id'; ~~~ 也强烈建议使用默认的主键字段名`id` #### `$table` 设置当前模型对应的完整数据表名称 #### `$connection` 设置当前模型的数据库连接 #### 了解更多 | 属性 | 描述 | | --- | --- | | name | 模型名(相当于不带数据表前后缀的表名,默认为当前模型类名) | | table | 数据表名(默认自动获取) | | suffix | 数据表后缀(默认为空) | | pk | 主键名(默认为`id`) | | connection | 数据库连接(默认读取数据库配置) | | query | 模型使用的查询类名称 | | field | 模型允许写入的字段列表(数组) | | schema | 模型对应数据表字段及类型 | | type | 模型需要自动转换的字段及类型 | | strict | 是否严格区分字段大小写(默认为true) | | disuse | 数据表废弃字段(数组) | 更多子类,自行[查看TP文档](https://www.kancloud.cn/manual/thinkphp6_0/1037580)