在使用thinkphp时,如果数据库表命名有大写,会被转换成小写加下划线(可以使用$model->_sql())来查看实际执行的sql是什么
这个问题,看了一下源代码,在 Thinkphp/Common/common.php里面,这个函数会将数据表(或视图)的大写字母转换为下划线+小写:
function parse_name($name, $type=0) {
if ($type) {
return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name));
} else {
return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
//<feixiang 2013年7月6日 这里会将数据库表名里的大写转换为 _小写,这里不转换,在Model.class.php还将表转换成了小写,需要改一下 >
//echo $name ;
//return $name;
}
}
另外,在 Thinkphp/Core/Model.class.php里面,会将整个表名转换成小写:
public function getTableName() {
if(empty($this->trueTableName)) {
$tableName = !empty($this->tablePrefix) ? $this->tablePrefix : '';
if(!empty($this->tableName)) {
$tableName .= $this->tableName;
}else{
$tableName .= parse_name($this->name);
}
//<feixiang 这里会将表名转换成小写,我们这里不转换>
$this->trueTableName = strtolower($tableName);
//$this->trueTableName = $tableName;
}
return (!empty($this->dbName)?$this->dbName.'.':'').$this->trueTableName;
}
这样有好处——规范。
但是在我们的开发中,有大写的数据表,所以改了一下(注释的那些)...
或者可以在模型定义里面加上:
protected $trueTableName = 'myTableName';
来覆盖$this->trueTableName