1

私は自分のWebアプリにYiiフレームワークを使用しています(ACTiveRecordを使用しています)。ACtiveRecordの後ろで、フレームワークはデータベースからのすべてのクエリを管理します。

私の問題は、共有サーバーを使用していることです。サーバーでクエリキャッシュが有効になっていることがわかりました。これは、Sの問題です。クエリキャッシュを回避する必要があります。私にはRELOAD特権がないため、FlUSHは機能しません。

各ActiveRecordデータベースフェッチを大まかなmySQLクエリとして使用した場合、NO_CACHEタグを使用したり、現在のタイムスタンプを含む誤ったクエリ用語を使用したりするなど、キャッシュを無効にする方法でクエリ自体を設定できたと思います(結果として各クエリは異なるクエリテキストです)。

皆さんへの私の質問は、Yii/ActiveRecordスキームでそれを行うための最良の方法は何ですか。findAll()関数の実装を変更できますか?私はCActiveRecordのサブクラスを持っているので、そこでできることがあれば完璧です。

長い質問でごめんなさい。イラン

4

1 に答える 1

1

デフォルトのスコープ

モデル クラスには、モデルに関するすべてのクエリ (リレーショナル クエリを含む) に適用される既定のスコープを設定できます。そのために、CActiveRecord::defaultScope メソッドを次のようにオーバーライドします。

class Content extends CActiveRecord
{
    public function defaultScope()
    {
        return array(
            'condition'=>"1<='".time()."'",
        );
    }
}

注:デフォルトのスコープと名前付きスコープは、SELECT クエリにのみ適用されます。INSERT、UPDATE、および DELETE クエリでは無視されます。また、スコープ (デフォルトまたは名前付き) を宣言する場合、スコープを宣言するメソッドで AR クラスを使用して DB クエリを作成することはできません。

http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

于 2013-01-17T13:35:30.533 に答える