欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Yii 1x 到 Yii 2x的细节变化

程序员文章站 2024-01-17 20:08:40
...
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 ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了Yii 1x 到 Yii 2x的细节变化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。