Laravel 9.x如何获取嵌套关联的Price集合及价格最值
问题背景
ServiceCategory 与 Service 为一对多关联:
public function services(): HasMany { return $this->hasMany(Service::class, 'category_id'); }
Service 与 ServicePrice(对应prices表)为一对多关联:
public function prices(): HasMany { return $this->hasMany(ServicePrice::class, 'service_id'); }
prices表包含price_value字段,需要获取关联数据中的最低、最高价格,但此前的查询仅返回ServiceCategory列表,无法直接拿到Price集合。
解决方案
1. 直接获取所有关联的Price集合并计算价格
若要拿到所有关联分类的Price数据,直接从ServicePrice模型发起查询更高效:
// 获取所有关联到分类的Price集合 $prices = ServicePrice::whereHas('service.category')->get(); // 计算最低、最高价格 $minPrice = $prices->min('price_value'); $maxPrice = $prices->max('price_value');
需确保Service模型中已定义与ServiceCategory的反向关联:
public function category(): BelongsTo { return $this->belongsTo(ServiceCategory::class, 'category_id'); }
2. 按分类分组,获取每个分类的最低/最高价格
如果需要每个分类对应的价格极值,可以通过数据库聚合查询直接计算:
use Illuminate\Support\Facades\DB; $categoriesWithPrices = ServiceCategory::withCount([ 'services.prices as min_price' => function ($query) { $query->select(DB::raw('min(price_value)')); }, 'services.prices as max_price' => function ($query) { $query->select(DB::raw('max(price_value)')); } ])->get(); // 遍历结果获取单分类价格 foreach ($categoriesWithPrices as $category) { echo "分类{$category->name}:最低价格{$category->min_price},最高价格{$category->max_price}"; }
3. 从单个分类提取Price集合
如果仅需某一个分类下的Price集合,可用集合的flatMap方法嵌套提取:
$category = ServiceCategory::first(); // 合并分类下所有服务的Price为单个集合 $prices = $category->services->flatMap(fn($service) => $service->prices); // 计算价格极值 $min = $prices->min('price_value'); $max = $prices->max('price_value');
你之前用ServiceCategory::with('services.prices')->get()返回分类列表,是因为查询起点是ServiceCategory,要拿到Price集合要么从关联数据中提取,要么直接从ServicePrice模型发起查询。
内容的提问来源于stack exchange,提问作者Hooman Limouee
相关产品推荐
相关产品推荐

