Запрос внутри модели redis в yii2 - PullRequest
0 голосов
/ 03 июня 2018

Я создал модель 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;
    }
}

Теперь я пытаюсь создать статическую функцию, которую я могу использовать, чтобы подсчитать все эти hitsзначение для конкретного user в Redis.Я создаю $query = new ActiveQuery($this); каждый раз в функции, но как можно инициализировать только одну копию запроса, чтобы всегда использовать его?Если я делаю это как свойство класса:

public $query = new ActiveQuery($this);

Я получаю ошибку expression is not allowed as field default value

1 Ответ

0 голосов
/ 03 июня 2018

Не следует повторно использовать существующий объект запроса (если только вы не хотите делать запрос с такими же условиями) - 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.

...