[英]Laravel sum from relationship with condition
我有以下查询,其中有两个模型之间的关系的条件查询。 我需要满足条件的出勤总和。 我尝试了以下方法,但它不起作用。
$users = User::with('attendance')
->whereHas('attendance', function (Builder $query) use ($end, $start) {
$query->whereBetween('date', [$start, $end])
->where('status', 2)
->select(DB::raw('SUM(hours) as h'));
})->orderBy('name')
->where('status', 0)
->get();
在我的刀下
@foreach($users as $user)
{{ $user->h }}
@endforeach
请帮忙
User::whereHas('attendance')
->withSum(['attendance' => function ($query) use ($start, $end){
$query->whereBetween('date', [$start, $end])
->where('status', 2);
}], 'hours')
->get();
您可以使用attendance_sum_hours
属性( {relation}_{function}_{column}
)访问总小时数
$user->attendance_sum_hours
小费:
还有一件事; $query->whereBetween('date', [$start, $end])
在datetime
列上使用whereBetween
时要小心,因为还会比较时间,所以结果不会是有利的使用whereBetweenColumn('date(date)', [$start, $end])
我不认为你可以用whereHas
做到这一点,但这就是你使用连接的方式。 这将返回在 2 个日期之间出勤的所有用户,然后为您提供计数。
$users = User::with('attendances')
->selectRaw('users.*, SUM(attendances.hours) as hours_sum')
->leftJoin('attendances', 'users.id', 'attendances.user_id')
->whereBetween('attendances.date', [$startDate, $endDate])
->groupBy('users.id')
->get();
但是,如果您想返回所有用户但如果他们没有出席,它将返回 0 您可以执行以下操作
$users = User::with('attendances')
->selectRaw('users.*, COALESCE(SUM(attendances.hours), 0) as hours_sum')
->leftJoin('attendances', function (JoinClause $joinClause) {
$joinClause->on('users.id', 'attendances.user_id')
->whereBetween('attendances.date', [$startDate, $endDate]);
})
->groupBy('users.id')
->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.