我已经创建了一个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中特定值的所有thi
hits
值。我每次都在函数中创建一个user
,但是如何初始化查询的一个副本以始终使用它呢?如果我喜欢类属性:$query = new ActiveQuery($this);
我得到错误
public $query = new ActiveQuery($this);
最佳答案
不应重用现有查询对象(除非希望使查询具有相同的条件)-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/