[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`