You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel缓存场景下如何为Cache::get添加ID/昵称搜索条件?

问题与解决方案

问题说明

现有Laravel代码实现缓存逻辑:若缓存存在则直接读取users缓存,不存在则从数据库查询结果并缓存60分钟。未使用缓存时,按ID/昵称的搜索功能正常,但启用缓存后搜索失效,疑问:使用Cache::get时能否添加搜索条件?

原代码问题分析

原代码的缓存键为固定值users,不管传入的id或nick_name是什么,只要缓存存在就返回同一组数据,完全忽略了搜索参数——这是搜索失效的核心原因。Cache::get本身不能直接添加搜索条件,它仅负责根据指定键读取缓存内容,要实现带搜索条件的缓存,需从缓存键的设计入手。

解决方案

为不同的搜索条件生成唯一的缓存键,让每个搜索组合对应独立的缓存条目。具体实现:

  1. 根据当前请求的搜索参数(id、nick_name)生成唯一标识,作为缓存键的一部分
  2. 先检查该唯一键对应的缓存是否存在,存在则直接读取;不存在则查询数据库并缓存结果

修改后的代码示例

public function index(Request $request)
{
    $id = $request->get('id');
    $nick_name = $request->get('nick_name');

    // 根据搜索参数生成唯一缓存键
    $cacheKey = 'users_' . md5(http_build_query([
        'id' => $id,
        'nick_name' => $nick_name
    ]));

    if (Cache::has($cacheKey)) {
        $users = Cache::get($cacheKey);
        return view('admin.users.index', compact('users'));
    }

    $users = User::when(!empty($id), function ($query) use ($id) {
        $query->where('id', $id);
    })->when(!empty($nick_name), function ($query) use ($nick_name) {
        $query->where('nick_name', $nick_name);
    })->orderBy('created_at', 'asc')->get();

    Cache::put($cacheKey, $users, now()->addMinutes(60));
    return view('admin.users.index', compact('users'));
}

关键说明

  • 使用http_build_query将搜索参数转为字符串,再用md5生成唯一哈希值,确保不同参数组合对应不同的缓存键
  • 这种方式既保留了缓存的性能优势,又能让不同搜索条件返回正确结果
  • 若搜索参数较少,也可直接拼接参数值生成键(如"users_id_{$id}_nickname_{$nick_name}"),但哈希方式更简洁,避免键名过长

内容的提问来源于stack exchange,提问作者kennedyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:45:38