ViewModel扩展类和定义了模型的$trueTableName属性的问题

浏览:2632 发布日期:2013/09/11 分类:技术分享 关键字: ViewModel
在自定义模型里使用了
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就可以了~ 让我纠结了一个上午~
最佳答案
评论() 相关
后面还有条评论,点击查看>>