- 🏠 简介
- 🔌 api接口
-
🔧 插件开发
- 介绍
- 插件优势
- 新建插件
- 技术栈
- 插件开发规范
- 插件目录结构
- model 层开发
- service 层开发
- api 接口开发
- menu 菜单开发
-
event 事件钩子开发
- 开发指南
- 常用事件
- SiteInit 站点初始化事件
- AddSiteAfter 站点创建后事件
- MemberRegister 会员注册后事件
- MemberLogin 会员登录后事件
- PayCreate 支付创建事件
- PaySuccess 支付成功事件
- RefundSuccess 退款成功事件
- TransferSuccess 转账成功事件
- BottomNavigation 底部导航事件
- NoticeData 消息模板数据内容事件
- GetQrcodeOfChannel 创建二维码事件
- ExportDataType 导出数据类型事件
- ExportData 导出数据源事件
- GetPosterType 海报类型事件
- GetPosterData 海报数据事件
- ShowCustomer 应用管理加载事件
- GetWechatTransferTradeScene 微信支付转账场景事件
- ThemeColor 主题风格事件
- initWap 手机端初始化加载事件
- dict 数据字典开发
- layout 自定义布局开发
- job 消息队列和计划任务开发
- notice 消息发送开发
- printer 小票打印模板开发
- export 数据导出开发
- diy 自定义组件/页面装修开发
- diy 自定义表单组件开发
- poster 自定义海报开发
- icon 引入图标
- 支付方式开发
- upgrade 插件版本升级
- 打包插件
- 授权信息变更回调通知
- 官网上架
- 📝 二次开发须知
- 👨💻 二次开发指导
-
🎬 二次开发应用插件视频教程
- 二次开发安装视频教程
- 准备工作与创建插件
- 插件目录整体说明
- 插件admin目录
- 插件app目录说明(adminapi、api、验证器)
- 插件app目录(dict、job)
- 插件app目录说明(lang、listener)
- 插件app目录说明(model、service)
- 插件uniapp目录说明
- 插件开发之后台功能开发(代码生成器)
- 插件开发之uniapp功能开发(api)第一节
- 插件开发之uniapp功能开发(api)第二节
- 插件开发之uniapp功能开发(api)第三节
- 插件安装与打包原理
- 消息队列开发
- 计划任务开发
- DIY组件和自定义页面装修开发
- 支付接口开发
- 插件升级包打包流程以及云编译功能
模型层开发指南
model层是插件开发中的数据模型层,负责数据库表结构的映射、数据查询、数据操作以及业务逻辑与数据库之间的交互。
数据表设计并创建好后,就要准备开发model模型层。
本文以hello_world插件的User模型为例,详细介绍模型的开发方式。
文件存放路径
model模型层的文件存放路径为:niucloud/addon/hello_world/app/model
建议把同类型的功能放在同一个文件夹下方便后续维护扩展。

定义模型
每个model类都需要继承自core\base\BaseModel,并遵循以下基本结构:
<?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 |
类型转换
支持给字段设置类型自动转换,类型转换确保数据在读取和写入时自动转换为指定类型,提高数据处理的一致性。例如:
/**
* 类型转换
* @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特性:
// 引入命名空间
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格式数据的字段,可以使用以下设置:
// 设置json类型字段
protected $json = ['extend_info', 'preferences'];
// 设置JSON数据返回数组
protected $jsonAssoc = true;
使用示例:
// 设置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();
在查询时,数据会自动转换类型,如图所示:
