# 模型定義
**為方便框架的后續升級,thinkcmf與thinkphp框架模型定義方法完全一致。**
*模型類并非必須定義,只有當存在獨立的業務邏輯或者屬性的時候才需要定義。*
模型類通常需要繼承系統的\Think\Model類或其子類,下面是一個Home\Model\UserModel類的定義:
```php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
}
```
模型類的作用大多數情況是操作數據表的,如果按照系統的規范來命名模型類的話,大多數情況下是可以自動對應數據表。
模型類的命名規則是除去表前綴的數據表名稱,采用駝峰法命名,并且首字母大寫,然后加上模型層的名稱(默認定義是Model),例如:
|模型名| 約定對應數據表(假設數據庫的前綴定義是 cmf_)|
|----|----|
|UserModel| cmf_user|
如果你的規則和上面的系統約定不符合,那么需要設置Model類的數據表名稱屬性,以確保能夠找到對應的數據表。
1. 數據表定義
在ThinkPHP的模型里面,有幾個關于數據表名稱的屬性定義:
|屬性 |說明|
|----|----|
|tablePrefix |定義模型對應數據表的前綴,如果未定義則獲取配置文件中的DB_PREFIX參數|
|tableName |不包含表前綴的數據表名稱,一般情況下默認和模型名稱相同,只有當你的表名和當前的模型類的名稱不同的時候才需要定義。|
|trueTableName |包含前綴的數據表名稱,也就是數據庫中的實際表名,該名稱無需設置,只有當上面的規則都不適用的情況或者特殊情況下才需要設置。|
|dbName |定義模型當前對應的數據庫名稱,只有當你當前的模型類對應的數據庫名稱和配置文件不同的時候才需要定義。|
舉個例子來加深理解,例如,在數據庫里面有一個cmf_users表,而我們定義的模型類名稱是UserModel,按照系統的約定,這個模型的名稱是User,對應的數據表名稱應該是cmf_user(全部小寫),但是現在的數據表名稱是cmf_users,因此我們就需要設置tableName屬性來改變默認的規則(因為cmf程序默認已經在配置文件里面定義了DB_PREFIX 為 cmf_)。
```php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $tableName = 'users';
}
```
注意這個屬性的定義不需要加表的前綴cmf_
如果我們需要CategoryModel模型對應操作的數據表是 top_user,那么我們只需要設置數據表前綴即可:
```php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $tablePrefix = 'top_';
}
```
如果你的數據表直接就是user,而沒有前綴,則可以設置tablePrefix為空字符串。
```php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $tablePrefix = '';
}
```
沒有表前綴的情況必須設置,否則會獲取當前配置文件中的 DB_PREFIX。
而對于另外一種特殊情況,我們需要操作的數據表是top_categories,這個時候我們就需要定義 trueTableName 屬性
```php
namespace Home\Model;
use Think\Model;
class CategoryModel extends Model {
protected $trueTableName = 'top_categories';
}
```
注意trueTableName需要完整的表名定義。
除了數據表的定義外,還可以對數據庫進行定義(用于操作當前數據庫以外的數據表),例如 top.top_categories:
```php
namespace Home\Model;
use Think\Model;
class CategoryModel extends Model {
protected $trueTableName = 'top_categories';
protected $dbName = 'top';
}
```
系統的規則下,tableName會轉換為小寫定義,但是trueTableName定義的數據表名稱是保持原樣。因此,如果你的數據表名稱需要區分大小寫的情況,那么可以通過設置trueTableName定義來解決。
2. 這里談下THINKPHP的自動驗證和自動完成功能(thinkcmf也是完全一樣的)
假設上文我們已經定義了Home\Model\UserModel.class.php
代碼完善后如下:
```php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
//自動完成
protected $_auto = array (
array('status','1'), // 新增的時候把status字段設置為1
array('random_str','creat_str',1,'function'), // 新增時自動完成random_str
);
//自動校驗
protected $_validate = array(
array('verify','require','驗證碼必須!'), //默認情況下用正則進行驗證
array('name','','帳號名稱已經存在!',0,'unique',1), // 在新增的時候驗證name字段是否唯一
array('value',array(1,2,3),'值的范圍不正確!',2,'in'), // 當值不為空的時候判斷是否在一個范圍內
array('name','check_name','密碼格式不正確',0,'function'), // 自定義函數驗證名稱是否為admin
);
/*
*為自動校驗定義的校驗方法 檢測名稱是否為admin
*@prama $name 名字
*/
function check_name($name){
return $name=='admin'?false:true;
}
/*
*為自動完成定義的完成方法//創建隨機字符串用來
*@prama $length 隨機字符串長度
*/
function creat_str($length=6){
return sp_random_string($length);
}
/*
// 隨機字符串生成 cmf自帶函數;
// @param int $len 生成的字符串長度
// @return string
function sp_random_string($len = 6) {
$chars = array(
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
"3", "4", "5", "6", "7", "8", "9"
);
$charsLen = count($chars) - 1;
shuffle($chars); // 將數組打亂
$output = "";
for ($i = 0; $i < $len; $i++) {
$output .= $chars[mt_rand(0, $charsLen)];
}
return $output;
}
*/
}
```
*參考文獻*
1. http://www.hmoore.net/manual/thinkphp/1728
2. http://www.thinkcmf.com/topic/topic/index/id/432.html
文檔問題聯系[iwzh](http://github.com/iwzh)
- 介紹
- 序言
- 關于ThinkCMF
- 關于BootStrap
- 基礎
- 開發規范
- 調試模式
- 應用
- 如何獲取
- 環境要求
- 安裝使用
- 配置
- 控制器
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 獲取內容
- 模板渲染
- 模型
- 模型定義
- 模型實例化
- 連接數據庫
- 更多模型用法
- 系統函數
- 生成評論組件
- 添加鉤子
- URL美化函數
- 獲取文件相對路徑
- 用戶權限驗證
- 字符串解密
- 字符串加密
- 獲取當前語言包
- 手機驗證碼驗證
- 檢查用戶操作
- 圖片驗證碼驗證
- 清除系統緩存
- 文本內容分頁
- 密碼比較
- 獲取文件訪問地址
- 獲取CMF設置
- 獲取評論
- 獲取當前登錄管理員id
- 獲取當前主題名
- 獲取當前登錄用戶信息
- 獲取當前登錄用戶ID
- 獲取收藏安全Key
- 獲取文件下載鏈接
- 獲取文件擴展名
- 獲取系統域名
- 獲取圖片預覽地址
- 獲取圖片訪問地址
- 生成前臺導航
- 獲取插件類名
- 獲取插件配置
- 獲取URL相對路徑
- 獲取前臺模板根目錄地址
- 獲取用戶頭像地址
- 獲取用戶列表
- 獲取廣告
- 獲取幻燈片
- 判斷是否為手機訪問
- 獲取HTML內容中的圖片
- 判斷用戶是否登錄
- 判斷是否為微信訪問
- 解析字符串標簽
- 生成密碼
- 插件URL生成
- 生成隨意字符串
- 遍歷目錄
- 發送郵件
- 更新動態配置
- 設置系統配置
- 更新當前登錄用戶
- 系統擴展
- 應用開發流程
- 后臺隱藏的后臺菜單管理功能
- 幾個重要基類
- 引入第三方庫
- 模板
- 基礎
- 全局變量
- 模板結構
- 模板注釋
- 模板常量
- 前臺模板多語言
- 變量輸出
- 使用函數
- 默認值輸出
- 使用運算符
- 三元運算
- 包含文件
- 原樣輸出
- 模板標簽
- tc\_include
- foreach
- volist
- php
- if else
- for
- switch
- 比較標簽
- 范圍判斷標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- 前端組件
- js-count-btn
- js-favorite-btn
- js-ajax-dialog-btn
- js-ajax-delete
- js-date
- js-datetime
- js-ajax-form
- 公共模板
- 菜單導航制作
- 幻燈片制作
- 廣告位制作
- 友情鏈接制作
- 添加留言控件
- 如何收藏
- 點贊組件
- 最新評論組件制作
- 最新加入組件制作
- 本站用戶登錄模板制作
- 本站用戶注冊模板制作
- 忘記密碼模板制作
- 密碼重置模板制作
- 評論組件
- 進階
- 七牛圖片處理
- 門戶應用
- 基礎
- 主程序結構
- 模板結構
- 函數庫
- 指定分類下的所有子分類
- 獲取面包屑數據
- 查詢文章列表,不分頁
- 獲取指定ID的文章
- 獲取指定ID的分類
- 獲取分類列表
- 獲取指定分類下的子分類
- 獲取文章列表,分頁
- 獲取指定 ID 的頁面
- 獲取指定分類下所有文章,包括子類的
- 獲取指定分類下所有文章,包括子類的,分頁
- 門戶模板制作
- 文章列表頁制作
- 文章內頁制作
- 頁面制作
- 獲取文章的各種方式
- 熱門文章組件制作
- seo優化
- 文章相冊制作
- 文章列表推薦功能制作
- 文章列表置頂功能制作
- 插件
- 插件鉤子
- 插件配置文件
- 插件類主文件
- 插件開發流程
- 插件控制器
- 插件數據庫模型
- 插件后臺管理控制器
- 插件多語言
- 后臺管理
- SMTP配置
- 忘記后臺密碼?
- 后臺地址是啥?
- 后臺菜單管理
- 管理員權限管理
- 第三方登錄配置
- 專題
- 多語言開發
- Restful Api
- 數據分頁
- 緩存
- 安全
- SESSION支持
- Cookie支持
- 文件上傳
- 驗證碼
- 部署
- 遷移到正式環境
- URL重寫