在維護一個tp寫的項目,因為需要在產品表product中增加了一個字段status,但是不論如何就是無法給status賦值,查了資料才發現,原來是tp的數據表字段緩存在搞鬼。
在runtime>Data>_fields文件中找到對應的文件,文件名與表名同,這里是Product.php,增加status。再次嘗試,立馬就可以了。
在網上看到一篇講這個問題的文章如下,
今天在應用thinkphp框架開發的程序做些二次開發修改, 其中有改動到數據結構,新增了幾個字段. 調用 M(‘xxx’)->add($data) 插入值時,新增的字段數據總是插入不進去,每次都是默認的值, 一直找看是不是什么語句寫錯了, 找了半天也沒出個所以然來. 后來將模型對象打印出來仔細查看,發現-他的 protected :成員變量 $fields 字段信息 中沒有我剛才添加的新字段名稱. 於是恍然—-緩存了… 清空緩存 . 終於可以正常插入數據了. 原來TP在配置文件中如果沒有關閉字段緩存設置,默認是開啟的,只要一運行它就會將數據字段信息緩存到~Runtime/Data/_files 文件夾下,並以數組方式存放在文件中. protected $fields = array(….); 當然你也可以在模型類里面手動定義數據表字段的名稱,可以避免IO加載的效率開銷,在模型類里面添加fields屬性即可,定義格式如下: PHP代碼 class UserModel extends Model{ protected $fields = array( ‘id’, ‘username’, ‘email’, ‘age’, ‘_pk’=>’id’, ‘_autoinc’=>true ) } 其中_pk 表示主鍵字段名稱 _autoinc 表示主鍵是否自動增長類型 可以通過設置DB_FIELDS_CACHE 參數來關閉字段自動緩存,如果在開發的時候經常變動數據庫的結構,而不希望進行數據表的字段緩存,可以在項目配置文件中增加如下配置: PHP代碼 ‘DB_FIELDS_CACHE’=>false 調試模式下面由於考慮到數據結構可能會經常變動,所以默認是關閉字段緩存的。ThinkPHP的默認約定每個數據表的主鍵名采用統一的id作為標識,並且是自動增長類型的。系統會自動識別當前操作的數據表的字段信息和主鍵名稱,所以即使你的主鍵不是id,也無需進行額外的設置,系統會自動識別。要在外部獲取當前數據對象的主鍵名稱,請使用下面的方法: PHP代碼 $pk = $Model->getPk(); 目前不支持聯合主鍵的自動操作。 在個別情況下,可能不需要對當前操作的數據表進行字段緩存,或許是由於采用了動態方式或者當前模型根本沒有任何相關的數據表,我們可以設置autoCheckFields屬性來關閉某個模型類的字段獲取和緩存。 使用getDbFields方法可以獲取當前數據對象的全部字段信息: PHP代碼 $fields = $User->getDbFields(); 由於沒有仔細看手冊,浪費了不少時間.
與yii不同,yii直接將數據表的字段寫在了模型中,包括字段的數據類型限制,對數據字段的檢驗等,更改數據表對應的更改模型文件即可。大概tp還沒有yii的功能強大。