
在 Laravel Eloquent 中,可通过向 with() 方法传入关系名称数组,一次性预加载多层嵌套关联(如 product.price 和 product.masterlist),有效避免 N+1 查询问题并提升性能。
在 laravel eloquent 中,可通过向 `with()` 方法传入关系名称数组,一次性预加载多层嵌套关联(如 `product.price` 和 `product.masterlist`),有效避免 n+1 查询问题并提升性能。
在构建复杂数据查询时,常需从主模型出发,同时获取其关联模型中的多个子关系。例如,StoreStock 模型关联 Product,而 Product 又分别关联 Price 和 MasterList 两个模型。若仅使用链式调用(如 with('product.price')),则无法同时加载 product.masterlist,导致要么遗漏数据,要么触发额外查询。
正确的做法是:将多个嵌套关系路径以字符串数组形式传入 with() 方法。Eloquent 会自动解析并一次性执行优化后的 JOIN 或独立查询(取决于关系类型和配置),确保所有指定关系被高效预加载。
✅ 正确示例:
$storeStocks = StoreStock::with([
'product.price',
'product.masterlist'
])->get();⚠️ 注意事项:
- 关系名称必须严格匹配模型中定义的关联方法名(如 Product 模型中需存在 price() 和 masterlist() 方法,注意命名一致性,建议使用小写字母+下划线或驼峰命名,与数据库字段风格统一);
- 不支持在单个字符串中用逗号分隔(如 'product.price, product.masterlist' 是无效的);
- 若需为某关系添加约束(如只加载启用的 Price),可结合闭包使用:
StoreStock::with([ 'product.price' => function ($query) { $query->where('status', 'active'); }, 'product.masterlist' ])->get(); - 避免过度预加载:仅加载视图或业务逻辑实际需要的关系,防止内存浪费和 SQL 复杂度上升。
? 总结:with(['relation1', 'relation2', 'parent.child.grandchild']) 是 Laravel 实现高效、可读、可维护关联查询的核心模式。掌握该语法,是写出高性能 Eloquent 查询的关键一步。










