繁体   English   中英

Laravel 与条件关系的总和

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM