Laravel跨表关联查询问题:调用sales_date生成销售图表
修正模型关联与年度销售统计逻辑
第一步:修正模型关联关系
你当前的模型关联完全搞反了——销售单(Sales)和销售明细(SalesItem)是一对多关系:一个销售单对应多条销售明细,一条明细只属于一个销售单。
Sales.php 修正后的关联:
// 一个销售单对应多条销售明细 public function salesItems() { return $this->hasMany(SalesItem::class, 'sales_id'); }
SalesItem.php 修正后的关联:
// 一条销售明细属于一个销售单 public function sale() { return $this->belongsTo(Sales::class, 'sales_id'); }
第二步:实现年度销售统计查询
要按sales_date的年份分组统计销售总价,你可以通过两种方式实现:
方式1:从销售明细出发关联销售表查询
直接通过join关联两张表,按年份分组并聚合总价:
use Illuminate\Support\Facades\DB; use App\Models\SalesItem; $annualSales = SalesItem::select( DB::raw('YEAR(sales.sales_date) as year'), DB::raw('SUM(sales_item_total_price) as total_sales') ) ->join('sales', 'sales_items.sales_id', '=', 'sales.id') ->groupBy('year') ->orderBy('year') ->get();
方式2:从销售单出发关联明细查询
利用Eloquent关联的聚合方法,更贴合Laravel的ORM风格:
use Illuminate\Support\Facades\DB; use App\Models\Sales; $annualSales = Sales::select( DB::raw('YEAR(sales_date) as year'), DB::raw('SUM(sales_items.sales_item_total_price) as total_sales') ) ->join('sales_items', 'sales.id', '=', 'sales_items.sales_id') ->groupBy('year') ->orderBy('year') ->get();
或者用withSum方法简化(Laravel 8+支持):
use Illuminate\Support\Facades\DB; use App\Models\Sales; $annualSales = Sales::withSum('salesItems', 'sales_item_total_price') ->select(DB::raw('YEAR(sales_date) as year')) ->groupBy('year') ->orderBy('year') ->get() ->map(function ($item) { return [ 'year' => $item->year, 'total_sales' => $item->sales_items_sum_sales_item_total_price ]; });
说明
- 确保
sales_items表中存在sales_id外键,关联sales表的id字段 - 查询结果会返回包含
year(年份)和total_sales(年度总销售额)的集合,可直接用于生成图表数据
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

