谁一开始就是大神?

为什么每次获取model对象时,都会出现"SHOW"语句?可以避免么?[2.0]

QQ截图20150609215040.png

use app\models\Article;
$test1  = Article::find()->where($map)->asArray()->one();
$test2  = Article::find()->where($map)->one();
$test3  = $test2->title;

其中$test2的过程会比$test1过程多一条“SHOW”查询,$test3多两条。

我是想把关联表的查询封装到一个模型内,没有封装时候调试工具显示只有5条查询,一旦将另一个模型封装在当前模型, 就变成了9条。

虽然看起来耗时很短,想问一下这个”show”语句的影响。

一个尝试性的封装,下面的只是一个例子,方式如下:

//文章表如下所示,还有个内容表,内容在内容表的"Content"字段中
namespace api\models;
use sys\core\base\BaseActiveRecord;

class Article extends BaseActiveRecord {

    private $_content = null; //表单"content",私有属性:文章内容。
/***********************************此处省略x行代码***********************************************/
    //用于获取文章内容
    public function getContent() {
        if ($this->isNewRecord) {
            return null;
        } else {          
            return $this->_content == null ? ArticleContent::findOne($this->content_id)->content : $this->_content;
        }
    }

调用如下所示:

$articleModel= Article::find()->where($sql)->one();
$articleContent=$articleModel->content;//由于对象$articleModel没有content,会自动调用getContent()方法,就和访问自己的属性一样了

上面这种方式获取文章内容会多出:

SHOW CREATE TABLE `frontend_article_content`
SHOW CREATE TABLE `frontend_article`
SHOW FULL COLUMNS FROM `frontend_article_content`
SHOW FULL COLUMNS FROM `frontend_article`

你看我如果用下面的方式获取文章内容就不会出现”show”语句:

$articleModel= Article::find()->where($sql)->asArray()->one();
$content     = ArticleContent::find()->where(['id' => $articleModel['content_id']])->asArray()->one();

但是却少了一些便利性,一定程度上也不能安全的保护数据,毕竟是关联模型。

数据库配置中开启表结构缓存 就没了。
楼上回答的很清楚了,赞一个
楼上回答的很清楚了,赞一个

赞(0) 打赏
未经允许不得转载:菜鸟之家 » 为什么每次获取model对象时,都会出现"SHOW"语句?可以避免么?[2.0]

评论 抢沙发

登录

找回密码

注册