activerecord - 在 yii2 的 redis 模型中查询

标签 activerecord redis yii2

我已经创建了一个 redis 模型,它应该像这样存储统计数据:

<?php

namespace app\models;

use Yii;
use yii\base\Model;
use \yii\redis\ActiveRecord;
use \yii\redis\ActiveQuery;

class StatsModel extends ActiveRecord
{

    public function attributes()
    {
        return ['id', 'hits', 'user', 'ua', 'ip','os'];
    }
    public function rules()
    {
        return [
            ['user', 'required'],
            ['user','string'],
            ['ip', 'required'],
            ['ip', 'integer'],
            ['hits', 'integer'],
            ['ua','string'],
            ['os','integer']
        ];
    }
    public static function total_user_hits($username)
    {
        $query = new ActiveQuery($this);
        $query->find()->where('user = '.$user)->all();
    }
    public static function getDb()
    {

        return \Yii::$app->db_redis;
    }
}

现在,我正在尝试制作一个我可以使用的静态函数来计算 Redis 中特定 user 的所有 hits 值。我每次都在函数中创建一个 $query = new ActiveQuery($this);,但是如何只初始化一个查询副本以始终使用它呢?如果我像类属性那样做:

public $query = new ActiveQuery($this);

我得到错误 expression is not allowed as field default value

最佳答案

你不应该重用现有的查询对象(除非你想用相同的条件进行查询)- ActiveQuery 是可变的,这意味着以前的查询可能会改变它的状态:

$query = new ActiveQuery(StatsModel::class);
$result1 = $query->andWhere('user = 1')->all(); // 1 result

$result2 = $query->andWhere('user = 2')->all(); // no results

第二个查询不会返回任何内容,因为它会创建类似 WHERE user = 1 AND user = 2 的条件,它始终为 false。

如果您担心性能,您不应该担心。创建 ActiveQuery 对象的开销可以忽略不计。在 PHP 中创建对象相对便宜,而且 ActiveQuery 非常轻量级 - 最耗时的事情将是对 redis/db 的实际查询。

关于activerecord - 在 yii2 的 redis 模型中查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50661225/

相关文章:

ruby-on-rails - 为 jsonb 值搜索构建 Activerecord/SQL 查询

amazon-web-services - 在 AWS 上具有多个实例的 Sails 应用程序 - Redis/Elasticache/ALB

ruby - 如何发送响应但继续在 Sinatra 中执行?

ruby-on-rails - 上帝无法启动redis服务器。收到此错误 : `/var/run/redis/redis-server.pid' : Permission denied

mysql - 易2 : Populate Another Table after Saving Data to One Table using values of the saved data table

ruby-on-rails - Rails ActiveRecord 返回相关表中存在 id 的记录

ruby-on-rails - ActiveRecord 模型的无限任意属性(键/值对)

ruby-on-rails - Rails - 跨 3 个表的事件记录联接

php - YII2 安静的奇怪行为

javascript - 如何让Jquery停止表单提交