如何在Laravel中缓存函数的结果

时间:2018-08-14 14:54:38

标签: php database laravel caching laravel-5

我想知道是否有可能针对每种可能的结果将函数的结果存储在缓存中。

这不是下面的确切示例,实际示例要复杂得多,出于速度原因,我需要缓存结果,但这使您对我要完成的事情有个了解

例如,我有一个检索用户评论的函数:

public function getUserComments(User $user)
{
    $comments = DB::table('comments')->where('user_id',$user->id)->get();
    return $comments;
}

我需要本质上保存系统中每个用户的所有可能结果。

例如,如果我有100个用户:

foreach ($users as $user) {
       $cachedResults [] = $user->getUserComments();
}

现在,我得到了更快查看的缓存结果: $ cachedResults

2 个答案:

答案 0 :(得分:0)

类似的事情应该可以解决(未经测试):

public function getUserComments(User $user)
{
    $key = "comments-${$user->id}";

    $comments = Cache::remember($key, 60, function () {
        return DB::table('comments')->where('user_id',$user->id)->get();
    });

    return $comments
}

60是这里的分钟数。如果要使用默认值(file缓存驱动程序)以外的其他功能,则必须配置缓存。

答案 1 :(得分:0)

我同意Stephan answer,您可以使用特定的键保存值,也可以使用tags,例如:

Cache::tags(['users', $name])->remember('model', 60, function () {
    // [...]
});

我更喜欢第二种方法,因为如果您对数据库进行一些更改,它很容易管理...

例如,您可以使用['users', $name]标签来存储指向特定用户的多个键,例如comments关系。

对用户模型进行更改时,只能使用“模型”键刷新['users', $name]标签。

如果删除用户,则将刷新['users', $name]标签;如果执行批量删除,则将刷新users标签,以便清除缓存中所有已存储的用户。

当然,您必须使用允许标签的缓存驱动程序。