2016-02-08 2 views
4

Comment gérer quand des changements se produisent dans des enregistrements de tables spécifiques?Comment vider le cache de requêtes db dans yii2?

public static function getAirportWithCache($iata_code){ 

       $result = Airports::getDb()->cache(function ($db) use ($iata_code){ 
        $res = Airports::find() 
           ->where(['iata_code' => $iata_code]) 
           ->limit(1) 
           ->asArray() 
           ->one(); 
        return $res; 
       }); 
       return $result; 
     } 
+0

Utilisez [Supprimer()] (http://www.yiiframework.com/doc-2.0/yii-caching-cache.html#delete%28%29-detail). –

+0

Dans la requête db je n'ai pas de clé spécifique. Comme Yii :: $ app-> cache-> delete ($ key); Dans mon exemple comment le faire? –

+0

Définissez une clé spécifique pour le cache, puis appelez delete(). Utilisez [set()] (http://www.yiiframework.com/doc-2.0/yii-caching-cache.html#set%28%29-detail) –

Répondre

0

exécuter juste Yii::$app->cache->flush(); partout (probablement dans votre contrôleur)

PS: Il supprimera le cache ensemble stocké dans votre serveur

+0

Je vais vérifier. et comment gérer si des changements se produisent dans un enregistrement spécifique à une table? –

+0

Aussi, cela va supprimer toute ma mise en cache. Je veux spécifique pour les requêtes DB. –

+2

Ce n'est certainement pas la solution, car il va vider tout votre cache. Cela signifie que query-cache, rbac-cache, schema-cache à propos de tout sauf si vous avez plusieurs composants de cache attachés ... – PLM57

3

Vous devez simplement utiliser \yii\caching\DbDependency, par exemple :

public static function getAirportWithCache($iata_code){ 
    // for example if airports count change, this will update your cache 
    $dependency = new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(*) FROM ' . Airports::tableName()]); 
    $result = Airports::getDb()->cache(function ($db) use ($iata_code){ 
     return Airports::find() 
      ->where(['iata_code' => $iata_code]) 
      ->limit(1) 
      ->asArray() 
      ->one(); 
    }, 0, $dependency); 
    return $result; 
} 

Read more ...

+1

Cela devrait être accepté comme réponse car c'est la bonne solution selon yii2-specs! – PLM57

+0

J'ai pensé faire cela mais comment Yii sait-il quand les données ont changé? Pour savoir, ne devrait-il pas faire une requête pour découvrir et donc vaincre le but de la mise en cache en premier lieu? – Brett

4

Pour cache global, peut utiliser:

Yii::$app->cache->flush(); 

pour spesific vous pouvez utiliser TagDependency:

//way to use 
return Yii::$app->db->cache(function(){ 
    $query = new Query(); 
    return $query->all(); 
}, 0, new TagDependency(['tags'=>'cache_table_1'])); 

//way to flush when modify table 
TagDependency::invalidate(Yii::$app->cache, 'cache_table_1'); 

voir la documentation http://www.yiiframework.com/doc-2.0/yii-caching-tagdependency.html

+0

Merci pour l'exemple TagDependency, il a aidé. – MaxGhost

+0

a voté pour TagDependency –