getDbFields
這個方法在tp手冊的字段定義中
通常每個模型類是操作某個數(shù)據(jù)表,在大多數(shù)情況下,系統(tǒng)會自動獲取當(dāng)前數(shù)據(jù)表的字段信息。
系統(tǒng)會在模型首次實例化的時候自動獲取數(shù)據(jù)表的字段信息(而且只需要一次,以后會永久緩存字段信息,除非設(shè)置不緩存或者刪除),如果是調(diào)試模式則不會生成字段緩存文件,則表示每次都會重新獲取數(shù)據(jù)表字段信息。
字段緩存保存在Runtime/Data/_fields/
目錄下面,緩存機制是每個模型對應(yīng)一個字段緩存文件(注意:并非每個數(shù)據(jù)表對應(yīng)一個字段緩存文件),命名格式是:
數(shù)據(jù)庫名.數(shù)據(jù)表前綴+模型名(小寫).php
demo.think_user.php // User模型生成的字段緩存文件
demo.top_article.php // Article模型生成的字段緩存文件
字段緩存包括數(shù)據(jù)表的字段信息、主鍵字段和是否自動增長,如果開啟字段類型驗證的話還包括字段類型信息等等,無論是用M方法還是D方法,或者用原生的實例化模型類一般情況下只要是不開啟調(diào)試模式都會生成字段緩存(字段緩存可以單獨設(shè)置關(guān)閉)。
可以通過設(shè)置DB_FIELDS_CACHE
參數(shù)來關(guān)閉字段自動緩存,如果在開發(fā)的時候經(jīng)常變動數(shù)據(jù)庫的結(jié)構(gòu),而不希望進行數(shù)據(jù)表的字段緩存,可以在項目配置文件中增加如下配置:
// 關(guān)閉字段緩存
'DB_FIELDS_CACHE'=>false
注意:調(diào)試模式下面由于考慮到數(shù)據(jù)結(jié)構(gòu)可能會經(jīng)常變動,所以默認(rèn)是關(guān)閉字段緩存的。
如果需要顯式獲取當(dāng)前數(shù)據(jù)表的字段信息,可以使用模型類的getDbFields方法來獲取當(dāng)前數(shù)據(jù)對象的全部字段信息,例如:
$User = M('User');
$fields = $User->getDbFields();
如果你在部署模式下面修改了數(shù)據(jù)表的字段信息,可能需要清空Data/_fields目錄下面的緩存文件,讓系統(tǒng)重新獲取更新的數(shù)據(jù)表字段信息,否則會發(fā)生新增的字段無法寫入數(shù)據(jù)庫的問題。
如果不希望依賴字段緩存或者想提高性能,也可以在模型類里面手動定義數(shù)據(jù)表字段的名稱,可以避免IO加載的效率開銷,例如:
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的話可以無需定義
}
如果你的數(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ù)表的字段之外,我們還可以定義字段的類型,用于某些驗證環(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') );}