## 模型定義
為方便框架的后續升級,FOHEARTCMF與thinkphp框架模型定義方法完全一致。 模型類并非必須定義,只有當存在獨立的業務邏輯或者屬性的時候才需要定義。
模型類通常需要繼承系統的\Think\Model類或其子類,下面是一個Home\Model\UserModel類的定義:
~~~
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
}
~~~
模型類的作用大多數情況是操作數據表的,如果按照系統的規范來命名模型類的話,大多數情況下是可以自動對應數據表。 模型類的命名規則是除去表前綴的數據表名稱,采用駝峰法命名,并且首字母大寫,然后加上模型層的名稱(默認定義是Model),例如: |模型名| 約定對應數據表(假設數據庫的前綴定義是 cmf_)| |----|----| |UserModel| cmf_user| 如果你的規則和上面的系統約定不符合,那么需要設置Model類的數據表名稱屬性,以確保能夠找到對應的數據表。
1、數據表定義 在ThinkPHP的模型里面,有幾個關于數據表名稱的屬性定義:
屬性 說明
tablePrefix 定義模型對應數據表的前綴,如果未定義則獲取配置文件中的DB_PREFIX參數
tableName 不包含表前綴的數據表名稱,一般情況下默認和模型名稱相同,只有當你的表名和當前的模型類的名稱不同的時候才需要定義。
trueTableName 包含前綴的數據表名稱,也就是數據庫中的實際表名,該名稱無需設置,只有當上面的規則都不適用的情況或者特殊情況下才需要設置。
dbName 定義模型當前對應的數據庫名稱,只有當你當前的模型類對應的數據庫名稱和配置文件不同的時候才需要定義。
舉個例子來加深理解,例如,在數據庫里面有一個cmfusers表,而我們定義的模型類名稱是UserModel,按照系統的約定,這個模型的名稱是User,對應的數據表名稱應該是cmf_user(全部小寫),但是現在的數據表名稱是cmf_users,因此我們就需要設置tableName屬性來改變默認的規則(因為cmf程序默認已經在配置文件里面定義了DB_PREFIX 為 cmf)。
~~~
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $tableName = 'users';
}
~~~
注意這個屬性的定義不需要加表的前綴cmf_
如果我們需要CategoryModel模型對應操作的數據表是 top_user,那么我們只需要設置數據表前綴即可:
~~~
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $tablePrefix = 'top_';
}
~~~
如果你的數據表直接就是user,而沒有前綴,則可以設置tablePrefix為空字符串。
~~~
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $tablePrefix = '';
}
~~~
沒有表前綴的情況必須設置,否則會獲取當前配置文件中的 DB_PREFIX。 而對于另外一種特殊情況,我們需要操作的數據表是top_categories,這個時候我們就需要定義 trueTableName 屬性
~~~
namespace Home\Model;
use Think\Model;
class CategoryModel extends Model {
protected $trueTableName = 'top_categories';
}
~~~
注意trueTableName需要完整的表名定義。 除了數據表的定義外,還可以對數據庫進行定義(用于操作當前數據庫以外的數據表),例如 top.top_categories:
~~~
namespace Home\Model;
use Think\Model;
class CategoryModel extends Model {
protected $trueTableName = 'top_categories';
protected $dbName = 'top';
}
~~~
系統的規則下,tableName會轉換為小寫定義,但是trueTableName定義的數據表名稱是保持原樣。因此,如果你的數據表名稱需要區分大小寫的情況,那么可以通過設置trueTableName定義來解決。
這里談下THINKPHP的自動驗證和自動完成功能(FOHEARTCMF也是完全一樣的) 假設上文我們已經定義了Home\Model\UserModel.class.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;
}
*/
}
~~~
參考文獻
http://www.hmoore.net/manual/thinkphp/1728
http://www.thinkcmf.com/topic/topic/index/id/432.html
文檔問題聯系[ityangs](ityangs@163.com)