2015-06-09 20:28:08 4696次浏览 3条回答 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();

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

最佳答案

您需要登录后才可以回答。登录 | 立即注册
webees
见习主管

webees 成都

注册时间:2015-06-06
最后登录:2020-01-14
在线时长:10小时52分
  • 粉丝5
  • 金钱180
  • 威望10
  • 积分380

热门问题