[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)
~~~

建議做無限極模型的時候,給`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
- 安全