Yii2 - 如何缓存数据库查询

问题描述 投票:0回答:1

我已经阅读了这里的许多关于此问题的帖子和文档,但仍然无法弄清楚如何做我想做的事情。

我正在使用带有下拉过滤器的 GridView。目前,我的

AudioModel
中有以下代码来获取选择数组:

Public function getFeednameSelect() {
   return ArrayHelper::map(
             Audio::find()
                ->select('feedname')
                ->distinct()
                ->asArray()
                ->all(),
             'feedname', 'feedname'),
}

web\config.php
包含

$config = [
    ...
    'components' => [
        ...
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
    ...

AudioModel
目前拥有超过 83k 条记录。我愿意

  • 可能缓存保存到文件中
  • 每天重建一到两次。
  • 如果 count(*) 发生变化,它可能会链接到不同模型
    Feeds
    模型中的变化。
  • 我正在使用基本应用程序

这是我第一次尝试缓存任何东西。

谢谢你。

---更新--- 我尝试过以下方法

    public function getFeednameSelect() {
        $duration = 86400;     // cache query results for 1 day (60*60*24 secs).
        $dependency = [
            'class' => 'yii\caching\DbDependency',
            'sql' => 'SELECT MAX(`modifieddatetime`) FROM `feeds`',
        ];

        return ArrayHelper::map(
                        $this->find()
                                ->select('feedname')
                                ->orderBy('feedname')
                                ->distinct()
                                ->asArray()
                                ->cache(15)                         // This works
                                //->cache($duration, $dependency)   // This doesn't
                                ->all(),
                        'feedname', 'feedname');
    }

当我使用

->cache($duration, $dependency)
时,我不断得到

Call to a member function evaluateDependency() on array

$this->find()
有效。
'sql' =>
语句中的字段名和表名是正确的。

yii2 yii2-basic-app
1个回答
0
投票

快到了。我认为你唯一需要改变的是

$dependency = [
    'class' => 'yii\caching\DbDependency',
    'sql' => 'SELECT MAX(`modifieddatetime`) FROM `feeds`',
];

进入

$dependency = new DbDependency();
$dependency->sql = 'SELECT MAX(`modifieddatetime`) FROM `feeds`';

现在您正在将依赖项作为数组传递,这可以解释错误。依赖项必须是一个对象,该对象扩展了 缓存依赖项类

© www.soinside.com 2019 - 2024. All rights reserved.