如果第个字段,一个一个地加,我觉得蛮烦人的一件事,纯粹是体力活了....
这就是我重写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(ti
生成的SQL:
SELECT id,concat(name,'-',id) as truename,LEFT(ti
如果直接写字符串:
$Model->field('id, concat(name,'-',id) truename, LEFT(ti
反而还简洁一些.
毕竟查询的字段,不像where条件那么活,它其实是比较死的东西,直接写字串就好了呀.
TP框架有时候就是这样,不该封装的东西,非要封装.....
最佳答案