上一篇
场景引入:
凌晨三点,你盯着屏幕里循环了20次的foreach
发呆,咖啡杯早已见底,产品经理昨天说的"简单列表展示"需求,现在卡在控制器里疯狂嵌套DB::query()
...别慌!这篇指南就是你的"救心丸" 💊
控制器不是垃圾场!记住三个核心原则:
❌ 反面教材:在控制器里写200行SQL
// 灾难现场(请勿模仿) public function getUserList() { $users = DB::select('SELECT * FROM users WHERE...(此处省略50行JOIN)'); foreach($users as $user) { // 又嵌套了订单查询... } }
👉 适用场景:需要关联数据但不想N+1查询
// 正确姿势 ✅ $posts = Post::with(['comments' => function($query) { $query->select('id','content')->latest(); }])->paginate(15);
📌 效果:1次主查询 + 1次关联查询(而不是每篇文章1次查询)
👉 适用场景:需要更新/删除多条记录时
// 低效做法 ❌ foreach ($ids as $id) { User::where('id', $id)->update(['status' => 1]); } // 高效做法 ✅ User::whereIn('id', $ids)->update(['status' => 1]);
⚡ 性能对比:100条记录从100次查询 → 1次查询
👉 适用场景:API接口返回精简数据
// 只取必要字段(连created_at都不要) $users = User::query() ->select('id','name','avatar') ->where('vip', true) ->get();
📦 好处:减少数据传输量,速度提升肉眼可见
👉 适用场景:任何列表型数据输出
// 基础分页 $products = Product::paginate(20); // 带条件的高级分页 $search = request('keyword'); $products = Product::when($search, function($q) use ($search) { return $q->where('title', 'like', "%{$search}%"); })->paginate(20);
🎨 前端适配:直接返回LengthAwarePaginator
对象,Laravel/Vue都能自动解析
👉 适用场景:高频读取但低频变更的数据
// 缓存要有失效策略! $hotArticles = Cache::remember('hot_articles', 3600, function() { return Article::with('author') ->where('views', '>', 1000) ->latest() ->take(10) ->get(); });
⏱️ 性能对比:数据库查询从200ms → 2ms
不要相信用户输入
// 危险操作!可能被SQL注入 DB::select("SELECT * FROM users WHERE id = {$request->id}"); // 正确做法 ✅ User::where('id', $request->id)->first();
警惕内存杀手
// 百万数据直接加载?服务器会哭的 😭 $allUsers = User::all(); // 改用chunk分批处理 User::chunk(200, function($users) { // 处理逻辑... });
事务要用对地方
DB::transaction(function() { // 相关操作原子化执行 $order = Order::create([...]); $order->items()->createMany([...]); });
记住这个黄金流程:
public function show($id) { // 1. 收 $validated = $request->validate(['id' => 'required|numeric']); // 2. 查 $user = UserService::getUserWithProfile($validated['id']); // 3. 转 $data = new UserResource($user); // 4. 返 return response()->json([ 'code' => 200, 'data' => $data ]); }
最后的小彩蛋 🥚:
下次看到同事在控制器写原生SQL,默默把这篇文章发给他...然后深藏功与名 😎
(本文基于2025-08行业实践整理,技术细节请以实际框架文档为准)
本文由 力梦蕊 于2025-08-02发表在【云服务器提供商】,文中图片由(力梦蕊)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/518502.html
发表评论