模型层开发指南
model层是插件开发中的数据模型层,负责数据库表结构的映射、数据查询、数据操作以及业务逻辑与数据库之间的交互。
数据表设计并创建好后,就要准备开发model模型层。
本文以hello_world插件的User模型为例,详细介绍模型的开发方式。
文件存放路径
model模型层的文件存放路径为:niucloud/addon/hello_world/app/model
建议把同类型的功能放在同一个文件夹下方便后续维护扩展。 
定义模型
每个model类都需要继承自core\base\BaseModel,并遵循以下基本结构:
php
<?php
namespace addon\hello_world\app\model\user;// 命名空间,对应目录结构
use core\base\BaseModel;// 继承基础模型
/**
* 用户模型描述
*/
class User extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'user_id'; // 设置主键字段
/**
* 模型名称
* @var string
*/
protected $name = 'user'; // 对应的数据表名(不含表前缀)
}注意
模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写。如果数据表定义了前缀,要去掉。例如:
| 数据表(假设数据库的前缀定义是 nc_ ) | 模型类 | 模型名称 |
|---|---|---|
| nc_user | User | user |
| nc_user_type | UserType | user_type |
类型转换
支持给字段设置类型自动转换,类型转换确保数据在读取和写入时自动转换为指定类型,提高数据处理的一致性。例如:
php
/**
* 类型转换
* @var array
*/
protected $type = [
'user_id' => 'integer', // 主键ID转整数
'start_time' => 'timestamp', // 开始时间转时间戳,默认的格式为Y-m-d H:i:s
'end_time' => 'timestamp', // 结束时间转时间戳,默认的格式为Y-m-d H:i:s
'score' => 'float', // 积分转浮点数
'extend_info' => 'array', // 扩展信息转数组
];在查询时,数据会自动转换格式,如图所示: 
支持的类型
timestamp: 时间戳类型,自动将数据库中的日期时间转换为时间戳
integer: 整数类型
float: 浮点类型
boolean: 布尔类型
array: 数组类型
json: JSON字符串类型
软删除
软删除功能允许在删除数据时不实际从数据库中删除记录,而是通过标记删除时间字段来实现逻辑删除。
如果需要软删除功能,需要引入SoftDelete特性:
php
// 引入命名空间
use think\model\concern\SoftDelete;
class User extends BaseModel
{
// 数据软删除
use SoftDelete;
/**
* 定义软删除标记字段
* @var string
*/
protected $deleteTime = 'delete_time';
/**
* 定义软删除字段的默认值
* @var int
*/
protected $defaultSoftDelete = 0;
}实现效果
删除时不会真正删除数据,而是将 delete_time 字段设置为当前时间戳。查询时会自动过滤掉 delete_time 不为0的记录。
删除:
// 软删除
User::destroy(1);
// 真实删除
User::destroy(1,true);
$user = User::find(1);
// 软删除
$user->delete();
// 真实删除
$user->force()->delete();查询包含已删除的数据:
User::withTrashed()->find();
User::withTrashed()->select();查询已删除数据:
User::onlyTrashed()->find();
User::onlyTrashed()->select();恢复已删除数据:
$user = User::onlyTrashed()->find(1);
$user->restore();JSON字段设置
对于需要存储JSON格式数据的字段,可以使用以下设置:
php
// 设置json类型字段
protected $json = ['extend_info', 'preferences'];
// 设置JSON数据返回数组
protected $jsonAssoc = true;使用示例:
php
// 设置JSON数据
$user = User::find(1);
$user->extend_info = [
'education' => '本科',
'skills' => ['PHP', 'JavaScript', 'Vue'],
'address' => [
'province' => '北京市',
'city' => '北京市',
'detail' => '朝阳区某某街道'
]
];
$user->save();
// 读取JSON数据
$user = User::find(1);
echo $user->extend_info['education']; // 输出:本科
$skills = $user->extend_info['skills']; // 直接以数组形式访问
print_r($skills); // 输出:Array ( [0] => PHP [1] => JavaScript [2] => Vue )
// JSON字段查询
$users = User::where("JSON_EXTRACT(extend_info, '$.education')", '本科')->select();在查询时,数据会自动转换类型,如图所示: 
