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
相关产品推荐
相关产品推荐

