2015-04-24 13 views
5

Come utilizzare ActiveRecotd cache per Yii 2? Non ho trovato alcun esempio nei documenti ufficiali. In Google ho trovato 2 esempi, prima è:Yii2 ActiveRecord cache

$db = self::getDb(); 
$object = $db->cache(function ($db) use($id) { 
    return self::findOne($id); 
}); 

Ma non funziona per Model, ho provato con quadro aggiornato. Altro esempio è:

$data = \Yii::$app->cache->get('some_var_' . $id); 
if ($data === false) 
{ 
    $data = self::findOne($id); 
    \Yii::$app->cache->set('some_var_' . $id, $data, 60); 
} 

Sta lavorando bene, ma non è ActiveRecord caching è caching dei dati, quindi non abbiamo avuto ActiveRecord memorizzazione nella cache in Yii 2?

risposta

6

1) Utilizzare la cache del genere:

$db = Yii::$app->db;// or Category::getDb() 
$result = $db->cache(function ($db) use ($id) { 
    return Category::find()->where(['id' => $id])->all(); 
}, CACHE_TIMEOUT); 

2) Se è possibile utilizzare query di dipendenza, utilizzare così:

$db = Yii::$app->db;// or Category::getDb() 
$dep = new DbDependency(); 
$dep->sql = 'SELECT count(*) FROM category'; 
$result = $db->cache(function ($db) use ($id) { 
    return Category::find()->where(['id' => $id])->all(); 
}, CACHE_TIMEOUT, $dep); 
2

anch'io sto avendo problemi con questo. Ecco la mia soluzione per il momento per una relazione hasOne().

Voglio solo memorizzare nella cache i dati per la richiesta corrente, quindi funziona. Tuttavia perché sto utilizzando ->one(); non restituisce l'oggetto ActiveQuery se chiamiamo $model->getGroup() (che ho trovato è un bene per le query che si estendono)

Purtroppo se faccio restituire l'oggetto ActiveQuery, Yii2 fa qualche "magia" su di esso e fa sempre un SELECT * che non posso controllare.

+0

In Yii AR è possibile utilizzare: $ model-> getGroup() per ottenere ActiveQuery o $ model-> group per ottenere l'oggetto BillChangesGroup (Yii2 magic -> group == getGroup() -> one() nell'esempio) . Nella tua soluzione ti manca questo. – BaBL86