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

Laravel通过模型查询数据库时加载关联关系的最优实现方法

Laravel 关联查询优化方案

你现有代码属于典型的N+1查询问题,查询N条课程数据后,循环内每次获取关联都会单独发起数据库请求,总查询次数为1+2N次,数据量越大性能损耗越严重。

Laravel 提供了关联预加载功能可以直接解决这个问题,仅需3次查询就能完成所有数据拉取,不需要额外循环赋值:

// 注意核对模型名,你原代码中的Cource为拼写错误,正确应为Course
$courses = Course::with(['image', 'rate'])
    ->orderBy('id', 'desc')
    ->take($count)
    ->get();

执行完上述代码后,直接访问$course->image、$course->rate即可拿到对应关联数据,不需要手动给模型属性赋值。

扩展使用场景

  • 仅需要关联的部分字段时,可按如下写法指定查询字段,注意必须包含关联外键和主键才能正常匹配:
$courses = Course::with(['image:id,course_id,img_url', 'rate:id,course_id,score'])
    ->orderBy('id', 'desc')
    ->take($count)
    ->get();
  • 需要给关联查询加条件时,可传入闭包自定义查询逻辑:
$courses = Course::with([
    'image' => function($query) {
        $query->where('is_valid', 1);
    },
    'rate' => function($query) {
        $query->orderBy('created_at', 'desc');
    }
])
->orderBy('id', 'desc')
->take($count)
->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 23:57:03