Laravel 5.6如何将集合存入全局变量避免重复数据库查询
嘿,我来帮你搞定这个Laravel 5.6里复用查询数据的问题!你不想重复执行数据库查询来提升性能的想法非常靠谱,下面给你几个实用的方案,根据你的业务场景选就行:
方案1:用Session临时存储数据
这是最直接的临时复用方式,把查询到的$data存在Session里,跳转到第二页后再取出来:
首先修改index控制器的逻辑,把数据存入Session:
public function index($x) { $data = Data::where('name', $x)->get(); // 将数据存入Session,Laravel会自动处理Eloquent集合的序列化 session()->put('cached_data', $data); return View::make('index', compact('data')); }
然后在second控制器里读取Session中的数据:
public function second() { // 先判断Session里有没有缓存的数据 if (session()->has('cached_data')) { $data = session()->get('cached_data'); // 可选:用完后删除Session里的数据,避免冗余 // session()->forget('cached_data'); } else { // 处理没有数据的情况,比如跳回首页提示用户 return redirect()->route('index')->with('error', '请先访问首页获取数据'); } return View::make('second', compact('data')); }
⚠️ 注意:如果$data是非常大的集合,建议只存储必要字段或者主键,避免Session占用过多内存。
方案2:通过URL传递标识符(推荐用于支持独立访问的场景)
如果你的$data可以通过某个唯一标识(比如$x)快速查询,那可以在跳转链接里带上这个标识,在第二页用它做精准查询——虽然还是会查库,但用唯一条件查询的速度极快(走索引),性能损耗可以忽略:
首先修改index视图里的跳转链接,带上$x参数:
<a href="{{ url('/second', ['x' => $x]) }}">跳转到第二页</a>
然后更新second的路由配置:
Route::get('/second/{x}', 'indexController@second');
最后在second控制器里用$x做精准查询:
public function second($x) { // 用唯一条件查询,速度远快于无索引的全表扫描 $data = Data::where('name', $x)->get(); return View::make('second', compact('data')); }
这个方案的好处是:即使用户直接访问/second/{x}也能正常获取数据,不需要依赖Session,稳定性更高。
方案3:用Laravel缓存系统(适合数据更新不频繁的场景)
如果你的$data不会频繁更新,可以用Laravel的缓存系统把查询结果存起来,后续不管是首页还是第二页,都直接读缓存:
在index控制器里给查询加缓存:
public function index($x) { // 缓存键用唯一标识区分,比如"data_{$x}",设置过期时间(示例为60分钟) $data = Cache::remember("data_{$x}", 60, function() use ($x) { return Data::where('name', $x)->get(); }); return View::make('index', compact('data')); }
然后在second控制器里直接读取缓存:
public function second($x) { $data = Cache::get("data_{$x}"); if (!$data) { // 缓存不存在时,跳回首页重新获取 return redirect()->route('index', ['x' => $x]); } return View::make('second', compact('data')); }
这种方案能最大程度减少数据库查询次数,缓存驱动还可以配置Redis、文件等,灵活性拉满。
内容的提问来源于stack exchange,提问作者Wejdan
相关产品推荐
相关产品推荐

