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();
但是却少了一些便利性,一定程度上也不能安全的保护数据,毕竟是关联模型。
数据库配置中开启表结构缓存 就没了。
楼上回答的很清楚了,赞一个
楼上回答的很清楚了,赞一个