yii1x到yii2x的细节变化

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]]进行嵌套的。

‘).addclass(‘pre-numbering’).hide();
$(this).addclass(‘has-numbering’).parent().append($numbering);
for (i = 1; i

Posted in 未分类