时间:2021-07-01 10:21:17 帮助过:36人阅读
Yii2
中将表名返回值默认格式是{{%user}}
Yii1
中返回的是{{user}}
Yii1
的path\to\yii\framework\db\schema\CDbSchema.php line78
if($this->_connection->tablePrefix!==null && strpos($name,'{{')!==false)
$realName=preg_replace('/\{\{(.*?)\}\}/',$this->_connection->tablePrefix.'$1',$name);
else
$realName=$name;
而Yii2
的
path\to\vendor\yiisoft\yii2\db\Connection.php line795
return preg_replace_callback(
'/(\\{\\{(%?[\w\-\. ]+%?)\\}\\}|\\[\\[([\w\-\. ]+)\\]\\])/',
function ($matches) {
if (isset($matches[3])) {
return $this->quoteColumnName($matches[3]);
} else {
return str_replace('%', $this->tablePrefix, $this->quoteTableName($matches[2]));
}
},
$sql
);
就会发现,不仅调用的类变了,而且就连方法都变了,使用了str_place
而不是快过时的prg_replace
同时也可以观察到正则表达式的变化,那么新增的后面的%
是什么呢?我本以为是后缀,看了半天源码也没有其他的东西,运行一下果然只是简单的替换。意思就是说,每添加一个%
就会被替换成一个前缀。可能是作者为了方便其他喜欢添加后缀的人吧。
再看一下后面的正则\\[\\[([\w\-\. ]+)\\]\\])
,如果表名是说的[[user]]
,那么就会调用$this->quoteColumnName($matches[3]);
返回的是`user`
,在外面套了一个反引号,本生成的sql语句中就已经有了反引号,所以,表名是不能使用[[xxx]]
进行嵌套的。
以上就介绍了Yii 1x 到 Yii 2x的细节变化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。