Yii2:如何缓存ActiveRecord关系产生的查询

时间:2016-05-16 12:21:11

标签: php caching activerecord yii2 query-cache

我有新闻表及其相关的news_comment表。 我已经使用news_comment表定义了关系newsComment。

如果我执行此查询:

public void checkDag(Node[][] AM)
    {
        for(int i = 0; i < AM.length; i++)
        {
            for(int j = 0; j < AM[i].length; j++)
            {
                if(AM[i][i].value == 1)
                {
                    //getting stuck on how to check parents.
                }
            }
        }
    }

只缓存从新闻表中获取数据的查询。从相关表中选择的查询不是。

是否可以同时缓存执行的主查询和查询以从相关表中检索数据,而无需单独编写它们?

2 个答案:

答案 0 :(得分:3)

试试这个:

$db = News::getDb();
$result = $db->cache(function ($db) use ($id) {
  $query = new \yii\db\Query;
  $query->select("news.*,newsComment.*") // write table name for newsComment model and also in join
        ->from('news')
        ->leftjoin('newsComment','newsComment.id=news.product_id')
        ->where(['news.id' => $id])
        ->one();

  $command = $query->createCommand();
  $result  = $command->queryAll();

  return $result;

});

答案 1 :(得分:1)

尝试添加$dbYii::$db作为参数:

$result = News::getDb()->cache(function ($db) {
    return News::find()->with('newsComment')->where(['news.id' => $id])->one();
});

或者在查询中添加缓存:

$result = News::find()->with('newsComment')->where(['news.id' => $id])->cache(60)->one();