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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:07:51