为什么每次获取model对象时,都会出现"SHOW"语句?可以避免么? [ 2.0 版本 ]
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();
但是却少了一些便利性,一定程度上也不能安全的保护数据,毕竟是关联模型。
最佳答案
其他 2 个回答
webees 成都
注册时间:2015-06-06
最后登录:2020-01-14
在线时长:10小时52分
最后登录:2020-01-14
在线时长:10小时52分
- 粉丝5
- 金钱180
- 威望10
- 积分380