Как использовать DbQueryDependency с mongodb в Yii2 - PullRequest
0 голосов
/ 14 мая 2019

Я хочу использовать DbQueryDependency для кэширования yii\mongodb\Query, но я получаю это:

[error][yii\base\InvalidConfigException] yii\base\InvalidConfigException: "yii\caching\DbQueryDependency::$query" should be an instance of "yii\db\QueryInterface". in /vendor/yiisoft/yii2/caching/DbQueryDependency.php:78
  • Mongodb 4.0.8
  • PHP 7.2.6
  • Yii 2.0.18
  • yiisoft / yii2-mongodb 2.1.7
  • yiisoft / yii2-redis 2.0.9
class Test extends yii\mongodb\ActiveRecord {
    // ...
    public static function findByTest($test){
        $dep = new DbQueryDependency([
            'query'=> (new Query())
                ->from('test')
                ->where(['test' => $test])
                ->orderBy(['updated_at' => -1 ])
                ->one(),
        ]);

        $cache = Yii::$app->cache;
        $key = 'test.'.$test;

        return $cache->getOrSet($key, function () use ($test) {
            return static::findOne(['test' => $test, 'status' => static::STATUS_ACTIVE]);

        }, 3600, $dep);
    }
    // ...
}

Ожидаю кеширование yiiДокумент mongodb за 1 час, если только updated_at не изменился, но на самом деле я получаю yii\base\InvalidConfigExc eption: "yii\caching\DbQueryDependency::$query" should be an instance of "yii\db\QueryInterface".

Как я могу это исправить?спасибо!

1 Ответ

0 голосов
/ 14 мая 2019

Вам необходимо удалить one() звонок из вашего кода.one() выполняет запрос и возвращает его результат, а сам запрос необходим.

Также вы можете попытаться оптимизировать свой запрос, выбрав только максимальное значение (или, по крайней мере, установив ограничение - one() не устанавливает ограничение, поэтому ваш запрос возвращает все данные из таблицы и PHP использует только первую запись).

'query' => (new Query())
    ->select('MAX(updated_at)')
    ->from('test')
    ->where(['test' => $test]),

или

'query' => (new Query())
    ->from('test')
    ->where(['test' => $test])
    ->orderBy(['updated_at' => SORT_DESC])
    ->limit(1),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...