很简单的问题结果浪费我一晚上的时间,问题的缘由是我在创建好数据表后写了一条add操作,后来发现数据表有些问题,又在数据表上增加了新的字段,然后再执行add操作,就发现出现数据对象错误的问题。
看代码:
/**
* 对保存到数据库的数据进行处理
* @access protected
* @param mixed $data 要操作的数据
* @return boolean
*/
protected function _facade($data) {
// 检查数据字段合法性
if(!empty($this->fields)) {
if(!empty($this->options['field'])) {
$fields = $this->options['field'];
unset($this->options['field']);
if(is_string($fields)) {
$fields = explode(',',$fields);
}
}else{
$fields = $this->fields;
}
foreach ($data as $key=>$val){
if(!in_array($key,$fields,true)){
if(APP_DEBUG){
E(L('_DATA_TYPE_INVALID_').':['.$key.'=>'.$val.']');
}
unset($data[$key]);
}elseif(is_scalar($val)) {
// 字段类型检查 和 强制转换
$this->_parseType($data,$key);
}
}
}
而 $this->fields是从下面的函数赋值的:
/**
* 自动检测数据表信息
* @access protected
* @return void
*/
protected function _checkTableInfo() {
// 如果不是Model类 自动记录数据表信息
// 只在第一次执行记录
if(empty($this->fields)) {
// 如果数据表字段没有定义则自动获取
if(C('DB_FIELDS_CACHE')) {
$db = $this->dbName?:C('DB_NAME');
$fields = F('_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name));
if($fields) {
$this->fields = $fields;
$this->pk = $fields['_pk'];
return ;
}
}
// 每次都会读取数据表信息
$this->flush();
}
}
这里涉及到thinkphp 的F方法,也就是缓存操作,原来表的字段会预先缓存到runtime中。方法就是删除缓存就可以了。