Laravel 8 如何优雅实现查询A表全量数据及关联B表非私密字段
Laravel 关联查询优化方案
方案1:带字段约束的预加载(推荐,最符合Laravel优雅特性)
该方案完全复用你已经定义好的模型关联,无需手写JOIN逻辑,同时适配A表数据量大、B表数据量极小的场景,性能优于大表JOIN:
public function index() { // 预加载关联B模型,仅查询需要的id、value字段,自动过滤private字段 $records = A::with('b:id,value') ->get(['id', 'b_id', 'value']); // 必须携带b_id用于关联匹配 // 可选:如果需要和原有JOIN返回的扁平化结构一致,追加这部分转换逻辑 $records->map(function ($item) { $item->b_value = $item->b->value; unset($item->id, $item->b_id, $item->b); return $item; }); return $records; }
如果不需要扁平化返回结构,直接去掉map逻辑即可,前端可直接通过item.b.value取到B表的value值,代码更简洁。
方案2:关联JOIN写法(适合需要单SQL查询的场景)
如果你的场景必须用单SQL查询,可以用joinRelation方法复用已定义的关联,避免硬写表名、关联字段:
public function index() { return A::select('as.value as a_value', 'bs.value as b_value') ->joinRelation('b') ->get(); }
方案选型建议
你给出的场景下优先选预加载方案:仅会执行2次查询(一次查A表全量数据,一次查B表关联数据,B表总共不到20条,查询开销可忽略),避免大表JOIN的性能开销,且后续维护成本更低,表名、关联字段修改时只要调整模型定义即可,无需修改查询代码。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

