標籤:ssi 避免 效率 usermod 表示 檔案名稱 extend 定義 對象
欄位定義
通常每個模型類是操作某個資料表,在大多數情況下,系統會自動擷取當前資料表的欄位資訊。
系統會在模型首次執行個體化的時候自動擷取資料表的欄位資訊(而且只需要一次,以後會永久緩衝欄位資訊,除非設定不緩衝或者刪除),如果是偵錯模式則不會產生欄位快取檔案,則表示每次都會重新擷取資料表欄位資訊。
欄位緩衝儲存在Runtime/Data/_fields/ 目錄下面,緩衝機制是每個模型對應一個欄位快取檔案(注意:並非每個資料表對應一個欄位快取檔案),命名格式是:
資料庫名.模型名(小寫).php
demo.user.php // User模型產生的欄位快取檔案demo.article.php // Article模型產生的欄位快取檔案
3.2.3版本開始,欄位緩衝的檔案名稱調整為:資料庫名.資料表首碼+模型名(小寫).php
demo.think_user.php // User模型產生的欄位快取檔案demo.top_article.php // Article模型產生的欄位快取檔案
欄位緩衝包括資料表的欄位資訊、主鍵欄位和是否自動成長,如果開啟欄位類型驗證的話還包括欄位類型資訊等等,無論是用M方法還是D方法,或者用原生的執行個體化模型類一般情況下只要是不開啟偵錯模式都會產生欄位緩衝(欄位緩衝可以單獨設定關閉)。
可以通過設定DB_FIELDS_CACHE 參數來關閉欄位自動緩衝,如果在開發的時候經常變動資料庫的結構,而不希望進行資料表的欄位緩衝,可以在項目設定檔中增加如下配置:
// 關閉欄位緩衝‘DB_FIELDS_CACHE‘=>false
注意:偵錯模式下面由於考慮到資料結構可能會經常變動,所以預設是關閉欄位緩衝的。
如果需要顯式擷取當前資料表的欄位資訊,可以使用模型類的getDbFields方法來擷取當前資料對象的全部欄位資訊,例如:
$User = M(‘User‘);$fields = $User->getDbFields();
如果你在部署模式下面修改了資料表的欄位資訊,可能需要清空Data/_fields目錄下面的快取檔案,讓系統重新擷取更新的資料表欄位資訊,否則會發生新增的欄位無法寫入資料庫的問題。
如果不希望依賴欄位緩衝或者想提高效能,也可以在模型類裡面手動定義資料表欄位的名稱,可以避免IO載入的效率開銷,例如:
namespace Home\Model;use Think\Model;class UserModel extends Model { protected $fields = array(‘id‘, ‘username‘, ‘email‘, ‘age‘); protected $pk = ‘id‘;}
pk屬性定義當前資料表的主鍵名,預設值就是id,因此如果是id的話可以無需定義。
3.2.3版本以上,支援定義複合主鍵,例如:
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‘);}
除了可以設定資料表的欄位之外,我們還可以定義欄位的類型,用於某些驗證環節。例如:
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‘) );}
ThinkPHP3.2基礎教程(6)--模型-欄位定義