重写模型field方法

浏览:1296 发布日期:2015/11/25 分类:技术分享 关键字: 框架
众所周知,联表查询时,会取个表别名,取了别名之后,相应地就要给字段加表别名.
如果第个字段,一个一个地加,我觉得蛮烦人的一件事,纯粹是体力活了....
这就是我重写field方法的初衷.



要用的话,自己定义的一个全局公共模型,然后,其他模板继承公共模板,就可以了随便用了. 支持字符串或数组作为参数.我个人测试过许多种情况,都能通过.如果大家在使用过程中,遇到问题,还请告知于我.    /**
     * 转换成带有表名的字段
     * $field = array('tb1'=>'id,name,age', 'tb2'=>'id AS id2, uname AS username');
     */
    
    public function field($field, $except=false){
    
        if(is_array($field)){
            $string = '';
            $pattern = array('/\s+/', '/(\s,|,\s)/', '/,(?!\w+\()/', '/\s(\w+)`/', '/(`\w+\b)(?!`)/', '/\(\s*(\w+)\s*\)/', '/`\*`*/');
            foreach($field as $table => $value){
                $replace = array(' ', ',',  '`,'.$table.'.`', ' $1', '$1`', '('.$table.'.`$1`)', '*');
                $value = preg_replace($pattern, $replace, ','.$value);
                $string .=  ltrim($value, '`,') .',';
            }
            $field = rtrim($string, ',');
    
        }
        return parent::field($field, $except);
    }
这的确破坏了原生的field方法.不过,我不喜欢原生field传数组的用法如:
$Model->field(array('id','concat(name,'-',id)'=>'truename','LEFT(title,7)'=>'sub_title'))->select();
生成的SQL:
SELECT id,concat(name,'-',id) as truename,LEFT(title,7) as sub_title FROM table
如果直接写字符串:
$Model->field('id, concat(name,'-',id) truename, LEFT(title,7) sub_title')->select();
反而还简洁一些.
毕竟查询的字段,不像where条件那么活,它其实是比较死的东西,直接写字串就好了呀.
TP框架有时候就是这样,不该封装的东西,非要封装.....
最佳答案
评论( 相关
后面还有条评论,点击查看>>