protected $trueTableName ="";
这个来定义模型后;(特别是在配置文件里写的表前缀和这里的不一样时候);
在使用视图模型时出现了诡异的问题; 在使用 order() 方法
class InsideDataModel extends Model{
protected $trueTableName = '';
public function __construct($name='',$tablePrefix='',$connection=''){
$this->trueTableName=C("DB_COMMPREFIX")."inside_data";
parent:: __construct($name,$tablePrefix,$connection);
}
}class ClientDataViewModel extends ViewModel{
public $viewFields = array(
'ClientData'=>array('*','_type'=>'LEFT'),
'InsideData'=>array('*', '_on'=>'InsideData.iuid=ClientData.uid')
);
}出现这种情况; order("`id` desc"") 生成的sql语句回事 order by InsideData. desc ; 在经过翻看源码后;发现在视图模型类里面有 定义 表达式过滤(_options_filter)的方法;在order表达式中;交给了$this->checkOrder($options['order'])这个函数来处理;Extend\Model\ViewModel.class.php
protected function checkOrder($order='') {
if(is_string($order) && !empty($order)) {
$orders = explode(',',$order);
$_order = array();
foreach ($orders as $order){
$array = explode(' ',$order);
$field = $array[0];
$sort = isset($array[1])?$array[1]:'ASC';
// 解析成视图字段
foreach ($this->viewFields as $name=>$val){
$k = isset($val['_as'])?$val['_as']:$name;
$val = $this->_checkFields($name,$val);
if(false !== $_field = array_search($field,$val,true)) {
// 存在视图字段
$field = is_numeric($_field)?$k.'.'.$field:$k.'.'.$_field;
break;
}
}
$_order[] = $field.' '.$sort;
}
$order = implode(',',$_order);
}
return $order;
}如上描述的情况; 该成员函数的 if(false !== $_field = array_search($field,$val,true)) 这一行;得不到想要的效果;因为($_field = array_search($field,$val,true)) 这个的结果为 NULL, 所以 这个判断为真;也就出现了所说的诡异现象;经过调试; 问题出现在_checkFields这个成员函数里;
Extend\Model\ViewModel.class.php
private function _checkFields($name,$fields) {
if(false !== $pos = array_search('*',$fields)) {// 定义所有字段
$fields = array_merge($fields,M($name)->getDbFields());
unset($fields[$pos]);
}
return $fields;
}里面第三行所使用的是M函数来获取数据库字段的;但M函数是不会去实例化自定义的模型类;恰好;自定义的模型类指定了真实的表名;但用M函数以表前缀+模型名的方法来列出表字段显然该表是不存在的; 所以 $fields 为NULL ; 解决办法:
很简单; 把M改为D就可以了~ 让我纠结了一个上午~
最佳答案