You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:45:30