31

Theoretical question on Laravel here.

So Example of the caching I'd do is:

Article::with('comments')->remember(5)->get();

Ideally I'd like to have an event for Article updates that when the ID of a instance of that model (that's already cached) is updated I want to forget that key (even if it's the whole result of the query that's forgotten instead of just that one model instance), it is possible to do so?

If not is there some way to implement this reasonably cleanly?

4

4 に答える 4

60

だから私はOPと同じ質問に対する答えを探していましたが、解決策に本当に満足していませんでした. だから私は最近これをいじり始め、フレームワークのソースコードを調べたところ、remember()メソッドが呼び出された2番目のパラメーターを受け入れkey、何らかの理由でサイトに文書化されていないことがわかりました(または見逃しましたか?)。

app/config/cache.phpこれについての良い点は、データベースビルダーは、ここで文書化されているのと同じキャッシュシステム - Cacheで構成されている同じキャッシュドライバーを使用することです。したがって、 min と key を に渡すとremember()、同じキーを使用してメソッドを使用してキャッシュをクリアできます。実際、公式サイトにリストされている 、 、 などのすべてのメソッドをほとんど使用できCache::forget()ます。何をしているのかわからない場合は、他の方法を使用することをお勧めします。CacheCache::get()Cache::add()Cache::put()

あなたと他の人が私の言いたいことを理解するための例を次に示します。

Article::with('comments')->remember(5, 'article_comments')->get();

これで、上記のクエリ結果がキャッシュされ、キーに関連付けられarticle_commentsます。これを使用して、いつでもクリアできます (私の場合、更新時に実行します)。

したがって、記憶している時間に関係なく、そのキャッシュをクリアしたい場合。呼び出すだけで実行できCache::forget('article_comments');、期待どおりに機能するはずです。

これがみんなに役立つことを願っています:)

于 2013-11-25T22:14:31.553 に答える
0

デバッグモードでテストしていました。そのため、 app.debug のテストをコンストラクターに配置すると、キーに関連付けられたキャッシュをクリアできることがわかりました。関数ごとにコードを複製する必要がなくなります。

class Events {
    public function __construct() {
        if (\Config::get('app.debug')) {
            Cache::forget('events');
        }
    }

    public static function all() {
        $events = \DB::table('events as e')
            ->select('e.*')
            ->where('enabled', 1)
            ->remember(30, 'events')
            ->get();

        return $events;
    }
}
于 2015-01-06T22:23:55.193 に答える