Laravel 8 Eloquent链式with关联查询的筛选与排序问题
Laravel 8 Eloquent 关联查询解决方案
直接给你链式内联的实现代码,同时满足两个需求:
// 假设主模型为 Recipe,根据实际业务替换为你的主模型名 $models = Recipe::with([ // 1. 仅从 cooking_methods 选取特定字段(必须包含关联外键) 'cooking_methods' => fn($query) => $query->select('id', 'name', 'recipe_id'), // 替换为实际关联外键和需要的字段 // 2. 按 priority 排序 suppliers 并仅取第一个结果 'suppliers' => fn($query) => $query->orderBy('priority', 'asc')->limit(1) ])->get();
关键说明:
- 选取关联模型特定字段时,必须包含关联外键(比如示例中的
recipe_id),否则 Eloquent 无法匹配主模型与关联模型的关系,会导致关联数据加载失败。 - 对 suppliers 的处理直接在预加载闭包里链式调用
orderBy()和limit(1),就能实现排序后仅保留第一条记录,Laravel 完全支持这种内联闭包的链式写法。 - 如果需要复用 suppliers 的优先排序逻辑,可以在主模型中单独定义关联方法:
之后预加载时直接使用public function primarySupplier() { return $this->hasOne(Supplier::class)->orderBy('priority', 'asc'); }with('primarySupplier')即可。
内容的提问来源于stack exchange,提问作者Alex Rhodes
相关产品推荐
相关产品推荐

