[TOC]
这里不介绍TP本身的一些方法了,都是基于(继承)TP的,所以该怎么用还是怎么用,自行查阅TP官方文档。
## `get_model_name` 助手函数 获取某个模型的命名空间+名称
~~~
/**
* 获取某个模型的命名空间+名称
* @param string $model
* @param string $app
* @return string 如果模型 返回模型命名空间+名称 否则返回 空字符串
*/
function get_model_name(string $model, string $app = '')
~~~
~~~
var_dump(get_model_name('Admin'));// string(22) "app\common\model\Admin"
var_dump(get_model_name('cms.Document'));// string(29) "app\common\model\cms\Document"
var_dump(get_model_name('Field'));// string(22) "woo\common\model\Field"
var_dump(get_model_name('Xixi'));// string(0) ""
~~~
注意它不是模型方法,是一个助手函数;它会根据系统中模型的结构,自动识别定位到模型的位置,并返回该位置(命名空间),如果不存在返回空字符串。你也可以用它判断一个模型是否存在。
## `model` 助手函数 实例化一个模型对象
~~~
/**
* 实例化一个模型对象
* @param string $model
* @param string $app
* @param bool $force 强制实例一个新对象
* @return mixed|object|\think\App
* @throws Exception
*/
function model($model, string $app = '', bool $force = false)
~~~
它先通过`get_model_name`定义到模型的命名空间,再做实例化;如果模型不存在会抛出一个异常;当你不确定你要实例的模型是否存在的时候可以先通过`get_model_name`判断下。
~~~
$admin = model('Admin');
$admin1 = model('Admin');
var_dump($admin === $admin1);//bool(true) 说明调用多次是同一个实例(单例) 它是通过TP容器进行处理的
$admin2 = model('Admin', '', true);// 强制实例
var_dump($admin === $admin2);//bool(false) 说明重新实例了另外一个对象
~~~
~~~
// 不确定是否存在的时候
if (get_model_name('Admin')) {
$admin = model('Admin');// 如果有这个模型才实例 免得报错
// ...
}
~~~
~~~
$list = model('Admin')->where([])->field(true)->select();
$list = \app\common\model\Admin::where([])->field(true)->select();
$list = (new \app\common\model\Admin)->where([])->field(true)->select();
~~~
上面几个查询效果一样的,通过`model`实例可能免去了你定位命名空间的麻烦。
## `afterStart` 开发者的初始化方法
~~~
protected function afterStart()
{}
~~~
每次实例都会执行,用于开发者定义模型实例就需要立即执行的代码。
这个方法可能会用得比较多,在每个自动生成的模型trait文件中,都有它。
你可以里面对form、tableTab等属性进行动态赋值和定义。
## `getDefaultOrder` 获取到当前模型的默认排序方式
~~~
public function getDefaultOrder()
~~~
~~~
$admin = model('Admin');
$list = $admin->order($admin->getDefaultOrder())->select();
~~~
## CURD封装
关于添加、修改、删除、查询、分页等;你可以直接参考TP文档,使用TP原本的方法进行操作。这里只是系统运用TP的原方法再做了一些封装而已。
封装的源码文件:`woo\common\model\traits\Curd.php`,有可能你会阅读源码,特别是分页。
### `createData` 添加数据
~~~
/**
* 写入数据
* @param array $data 写入数据
* @param array $options 选项
* @return bool 失败返回false 成功返回主键值
*/
public function createData(array $data, array $options = [])
~~~
~~~
$admin = model('Admin');
$result = $admin->createData([
'username' => 'test123',
'password' => 'test123'
]);
var_dump($result);// bool(false) 失败了 因为模型中自动验证了
if ($result) {
// 添加成功
} else {
// 添加失败
pr($admin->getError());// 获取到失败原因
}
~~~
~~~
$admin = model('Admin');
// 添加的时候 默认会自动验证 如果不希望验证就isValidate(false)
$result = $admin->isValidate(false)->createData([
'username' => 'test1234',
'password' => 'test1234',
'email' => '1234567@qq.com'
]);
var_dump($result);// string(1) "2" 成功了 因为没有做验证了 获取到自增id
if ($result) {
// 添加成功
// 你可以通过 模型对象 $admin获取到更多数据
pr($admin->toArray());
} else {
// 添加失败
pr($admin->getError());// 获取到失败原因
}
~~~
### `modifyData` 修改数据
~~~
/**
* 更新数据
* @param array $data 要更新的数据
* @param array $options 选项
* @return bool 失败返回false 成功返回主键值
* 估计较多人会使用错误,必须自己先查询以后再调用modifyData
* eg. 比如要更新id为1的用户信息,必须先自己查询一次,再通过查询返回的模型对象进行modifyData操作 没法tp6就是这样搞的
* $model = model('User')->find(1);
* $model->modifyData($data);
*/
public function modifyData(array $data, array $options = [])
~~~
~~~
// 必须先查下 获取到数据模型对象(就是该模型中已经包含了数据,它已经对应上数据库的一条数据了)
$admin = model('Admin')->find(2);
if ($admin) {
// 如果不希望自动验证:isValidate(false)
$result = $admin->isValidate(false)->modifyData([
'password' => '456798'
]);
var_dump($result);// 失败返回false 成功返回id值
if ($result) {
//修改成功
} else {
//修改失败 获取到错误原因
pr($admin->getError());
}
}
~~~
### `deleteData` 删除数据
~~~
/**
* @param $id 需要删除数据的主键值 可以是一个数字 也可以是数组删除多个
* @param array $where 被删除数据额外的条件
* @param bool $force 是否强行删除
* @return array|bool 失败返回false 成功返回数组(包含删除的数据、删除条数、成功删除条数)
*/
public function deleteData($id, array $where = [], bool $force = false)
~~~
### `restoreData` 恢复数据
~~~
/**
* 恢复数据
* @param $id 需要恢复的id 可以是数组
* @param array $where 额外的条件
* @return array|bool
*/
public function restoreData($id, array $where = [])
~~~
### `getPage` 分页查询
~~~
/**
* 数据分页
* @param array $options
* @return array
*/
public function getPage(array $options = [])
// $options 可以带的参数
$options = [
'where' => [],
'whereCallback' => '',//用于传递闭包
'order' => [],
'with' => [],
'withJoin' => [],
'whereOr' => [],
'whereColumn' => [],
'whereTime' => [],
'field' => true,
'limit' => 15,
'paginate' => [
// paginate 下可以带的参数:
list_rows 每页数量
page 当前页
path url路径
query url额外参数
fragment url锚点
var_page 分页变量
type 分页类名
simple 简洁分页
total 总条数
]
];
~~~
~~~
$pages = model('Admin')->getPage([
// where 传递条件
// order 传递排序 默认会自动识别
// with 传递关联模型
// ...
]);
pr($pages);// 包含了render:翻页的html结构 page:翻页统计 list:本页列表数据
~~~
### `getNext` 获取指定数据的下一条数据
~~~
/**
* 获取下一条数据
* @param int $id
* @param array $options
* @return array
*/
public function getNext(int $id, array $options = [])
~~~
### `getPrev` 获取指定数据的上一条数据
~~~
/**
* 获取上一条数据
* @param int $id
* @param array $options
* @return array
*/
public function getPrev(int $id, array $options = [])
~~~
## `getParentModel` 获取到当前模型的父模型
~~~
$admin = model('Setting');
var_dump($admin->getParentModel());//string(12) "SettingGroup"
~~~
模型中设置了`parentModel`属性以后有效;否则返回false
## `getParentId` 获取与父模型之间的关联字段名
~~~
$admin = model('Setting');
var_dump($admin->getParentId());//string(16) "setting_group_id"
~~~
模型中设置了`parentModel`属性以后有效;否则返回null
## `forceError` 给模型加注错误信息
~~~
$admin = model('Admin');
$admin->forceError('username', '用户名错误');
$admin->forceError([
'password' => '密码错误',
'email' => '邮箱错误'
]);
pr($admin->getError());
~~~
## `getError` 获取模型中的错误信息
## `selectField` 设置查询的时候查询的字段列表
~~~
/**
* 选择查询的字段列表
* @param bool $field true 全部字段 数组 自定字段
* @param array $except 排除的字段 如(true, ['a']) 表示除了a字段都要
* @return array
*/
public function selectField($field = true, array $except = [])
~~~
~~~
$admin = model('Admin');
// $list = $admin->select();// 1、查询所有字段
// $list = $admin->field(true)->select();// 2、查询所有字段
// $list = $admin->field(['id', 'username', 'email' => 'youxiang'])->select();// 3、查询指定字段
// $list = $admin->field($admin->selectField(true))->select(); // 等效2
// $list = $admin->field($admin->selectField(['id', 'username', 'email' => 'youxiang']))->select();// 等效3
$list = $admin->field($admin->selectField(true, ['password']))->select();// 除了password字段都查
~~~
## `isSoftDelete` 判断当前模型是否是软删除
## `checkParent` 无限极parent_id的一个自定义验证方法
~~~
/**
* 父级ID 的验证方法 'rule' => ['call', 'checkParent']
* @param $value
* @param $rule
* @param $data
* @return bool|string
*/
public function checkParent($value, $rule, $data)
~~~
![](https://img.kancloud.cn/df/c4/dfc4d71c42c0fb54e48b00359f4fe4c4_701x284.png)
建议做无限极模型的时候,给`parent_id`字段加上该方法的一个自定义验证规则。
它可以验证选择的父id不能是本身或子id,以及最多级数 `$treeLevel`
- 2.0开发手册
- 基础
- 简介
- 安装
- 目录
- 规范(必看)
- 快速开发
- 创建模型
- 字段管理
- 无限级开发
- 模型Model
- 定义
- 方法
- 事件
- 关联
- 关联查询
- 验证
- 后台控制器Controller
- 定义
- 列表【index】
- 新增【create】
- 修改【modify】
- 删除【delete】
- 详细【detail】
- 文本审核【antispam】
- 清空数据【clearData】
- 自定义页面
- 视图View
- 视图使用
- 引入CSS和JS
- 基础表单构建Form
- 布局表单构建FormPage
- 表单构建器的基础使用
- 表单项
- 表单分组
- 表单触发器
- 表单布局
- 数据提交验证和入库
- 集成tinymce编辑器
- 集成nkeditor编辑器
- 表格构建Table
- 表格构建器基础使用
- 表格构建器列表字段相关
- 自定义列表头部工具按钮
- 自定义列表项工具按钮
- 自定义搜索
- 定义列表侧边栏
- 静态数据
- 更多属性和回调
- 自定义模板V2.1.0
- 列表统计输出V2.1.2
- 常见问题
- 自定义应用
- 创建新应用
- 应用开发
- API应用
- 自定义插件
- 创建新插件
- 杂项
- 认证Auth
- 权限管理
- 上传Upload
- 批量导入
- 助手库
- 系统配置
- 字典
- 二维码生成
- 源码修改
- 常见问题
- 小技巧,小细节
- 插件
- oauth
- APP一键登录
- 微信小程序登录
- 2.0CMS建站
- 基础
- 安装
- 建站
- Callback
- 引入CSS和JS
- 模板
- 栏目数据
- 列表页数据
- 详细页数据
- 栏目封面
- 自定义表单
- 其他数据和自定义数据
- wap视图层
- 前台搜索
- API开发
- CMS应用日志
- CMS升级指导
- 中台-SAAS开发
- 安装
- 中台日志
- 中台升级指导
- ★★2.0视频教程★★
- 附录
- Admin核心更新日志
- Admin核心升级指导
- composer
- 安全