getDbFields
這個(gè)方法在tp手冊(cè)的字段定義中
通常每個(gè)模型類(lèi)是操作某個(gè)數(shù)據(jù)表,在大多數(shù)情況下漠酿,系統(tǒng)會(huì)自動(dòng)獲取當(dāng)前數(shù)據(jù)表的字段信息。
系統(tǒng)會(huì)在模型首次實(shí)例化的時(shí)候自動(dòng)獲取數(shù)據(jù)表的字段信息(而且只需要一次谎亩,以后會(huì)永久緩存字段信息炒嘲,除非設(shè)置不緩存或者刪除),如果是調(diào)試模式則不會(huì)生成字段緩存文件匈庭,則表示每次都會(huì)重新獲取數(shù)據(jù)表字段信息夫凸。
字段緩存保存在Runtime/Data/_fields/
目錄下面,緩存機(jī)制是每個(gè)模型對(duì)應(yīng)一個(gè)字段緩存文件(注意:并非每個(gè)數(shù)據(jù)表對(duì)應(yīng)一個(gè)字段緩存文件)阱持,命名格式是:
數(shù)據(jù)庫(kù)名.數(shù)據(jù)表前綴+模型名(小寫(xiě)).php
demo.think_user.php // User模型生成的字段緩存文件
demo.top_article.php // Article模型生成的字段緩存文件
字段緩存包括數(shù)據(jù)表的字段信息夭拌、主鍵字段和是否自動(dòng)增長(zhǎng),如果開(kāi)啟字段類(lèi)型驗(yàn)證的話還包括字段類(lèi)型信息等等衷咽,無(wú)論是用M方法還是D方法鸽扁,或者用原生的實(shí)例化模型類(lèi)一般情況下只要是不開(kāi)啟調(diào)試模式都會(huì)生成字段緩存(字段緩存可以單獨(dú)設(shè)置關(guān)閉)。
可以通過(guò)設(shè)置DB_FIELDS_CACHE
參數(shù)來(lái)關(guān)閉字段自動(dòng)緩存镶骗,如果在開(kāi)發(fā)的時(shí)候經(jīng)常變動(dòng)數(shù)據(jù)庫(kù)的結(jié)構(gòu)桶现,而不希望進(jìn)行數(shù)據(jù)表的字段緩存,可以在項(xiàng)目配置文件中增加如下配置:
// 關(guān)閉字段緩存
'DB_FIELDS_CACHE'=>false
注意:調(diào)試模式下面由于考慮到數(shù)據(jù)結(jié)構(gòu)可能會(huì)經(jīng)常變動(dòng)卖词,所以默認(rèn)是關(guān)閉字段緩存的。
如果需要顯式獲取當(dāng)前數(shù)據(jù)表的字段信息,可以使用模型類(lèi)的getDbFields方法來(lái)獲取當(dāng)前數(shù)據(jù)對(duì)象的全部字段信息此蜈,例如:
$User = M('User');
$fields = $User->getDbFields();
如果你在部署模式下面修改了數(shù)據(jù)表的字段信息即横,可能需要清空Data/_fields目錄下面的緩存文件,讓系統(tǒng)重新獲取更新的數(shù)據(jù)表字段信息裆赵,否則會(huì)發(fā)生新增的字段無(wú)法寫(xiě)入數(shù)據(jù)庫(kù)的問(wèn)題东囚。
如果不希望依賴(lài)字段緩存或者想提高性能,也可以在模型類(lèi)里面手動(dòng)定義數(shù)據(jù)表字段的名稱(chēng)战授,可以避免IO加載的效率開(kāi)銷(xiāo)页藻,例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model
{
protected $fields = array('id', 'username', 'email', 'age');
protected $pk = 'id';
//pk屬性定義當(dāng)前數(shù)據(jù)表的主鍵名,默認(rèn)值就是id植兰,因此如果是id的話可以無(wú)需定義
}
如果你的數(shù)據(jù)表使用了復(fù)合主鍵份帐,可以這樣定義:
namespace Home\Model;
use Think\Model;
class ScoreModel extends Model {
protected $fields = array('user_id', 'lession_id','score');
protected $pk = array('user_id','lession_id');
}
除了可以設(shè)置數(shù)據(jù)表的字段之外,我們還可以定義字段的類(lèi)型楣导,用于某些驗(yàn)證環(huán)節(jié)废境。例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age', '_type'=>
array('id'=>'bigint','username'=>'varchar','email'=>'varchar','age'=>'int') );}