0

我创建了一个 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;
    }
}

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

public $query = new ActiveQuery($this);

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

4

1 回答 1

1

您不应该重用现有的查询对象(除非您想使用相同的条件进行查询) -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始终为假的条件。

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

于 2018-06-03T09:40:25.240 回答