Laravel中如何根据条件对数据透视表关联字段求和
解决Laravel中仅统计付费关联课程的费用总和问题
嘿,作为Laravel新手,这种涉及多表关联的统计需求确实容易让人摸不着头脑,我来给你两种实用的实现方式,你可以根据自己的习惯选择~
方法一:使用Eloquent模型关联(推荐,代码更优雅)
首先,我们需要给对应的表创建模型并建立关联关系:
- 创建Course模型(如果还没创建的话):
// app/Models/Course.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Course extends Model { // 如果你的表名不是默认的复数courses,需要指定表名 // protected $table = 'Course'; // 关联Courses_members表 public function courseMembers() { return $this->hasMany(CoursesMembers::class, 'course_id'); } }
- 创建CoursesMembers模型:
// app/Models/CoursesMembers.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class CoursesMembers extends Model { // 指定表名(因为模型名和表名的驼峰转下划线是courses_members,刚好匹配,也可以省略) protected $table = 'courses_members'; // 如果表没有created_at和updated_at字段,需要关闭自动时间戳 public $timestamps = false; }
- 执行求和操作:
我们用whereHas方法筛选出至少有一个付费成员的课程,然后对course_fee求和:
// 在控制器或者需要的地方调用 use App\Models\Course; $totalPaidFee = Course::whereHas('courseMembers', function ($query) { // 筛选付费状态为1的关联记录 $query->where('paid', 1); })->sum('course_fee');
方法二:使用查询构造器(快速实现,无需模型关联)
如果你暂时不想创建模型或者需要快速写查询,可以直接用DB门面:
注意:这里要区分两种统计场景
- 场景1:统计所有有至少一个付费成员的课程总费用(每个课程只算一次)
如果同一个课程有多个付费成员,我们需要避免重复计算该课程的费用,所以要加上distinct:
use Illuminate\Support\Facades\DB; $totalPaidFee = DB::table('courses') ->join('courses_members', 'courses.id', '=', 'courses_members.course_id') ->where('courses_members.paid', 1) ->distinct('courses.id') // 确保每个课程只被统计一次 ->sum('courses.course_fee');
- 场景2:统计所有付费记录对应的课程费用总和(每个付费成员对应一次课程费用,即总营收)
如果需要统计每一笔付费对应的课程费用总和(比如一个课程有3个付费成员,就加3次该课程的fee),直接去掉distinct即可:
$totalRevenue = DB::table('courses') ->join('courses_members', 'courses.id', '=', 'courses_members.course_id') ->where('courses_members.paid', 1) ->sum('courses.course_fee');
小提示
- 记得根据你的实际表名调整代码中的表名(比如你的Course表如果是大写开头的
Course,需要在模型里指定protected $table = 'Course') - 可以用
dd($totalPaidFee)来打印结果,验证是否符合预期
内容的提问来源于stack exchange,提问作者Alea
相关产品推荐
相关产品推荐

