getModelFilter(); $query = $this->query(); if ($this->withRelationships) { $query->with($this->withRelationships); } if ($filter) { $query->filter(request()->input(), $filter); } $request = request(); if ($request->filled('id')) { $id = $request->input('id'); $query->whereIn('id', is_array($id) ? $id : explode(',', $id)); } $subQuery = fn ($q) => $q->filter(request()->except(['id'])); $query->select(['id', 'name'])->with([ 'doctors' => $subQuery, 'inviters' => $subQuery, 'salers' => $subQuery ]); return $query; } public function list() { $query = $this->listQuery(); $list = (clone $query)->paginate(request()->input('perPage', 20)); $items = collect($list->items())->map(function ($item) { $item['doctor_money'] = round($item->doctors->sum('doctor_money'), 2, PHP_ROUND_HALF_DOWN); $item['inviter_money'] = round($item->inviters->sum('inviter_money'), 2, PHP_ROUND_HALF_DOWN); $item['saler_money'] = round($item->salers->sum('saler_money'), 2, PHP_ROUND_HALF_DOWN); $item['records_count'] = floor($item->doctors->count() + $item->inviters->count() + $item->salers->count()); $item['total_money'] = round($item['doctor_money'] + $item['inviter_money'] + $item['saler_money'], 2, PHP_ROUND_HALF_DOWN); return $item; }); $doctorQuery = PatientRecord::filter([ 'type_id' => request('type_id'), 'treat_range' => request('treat_range'), 'doctor_id' => request('id') ]); $inviterQuery = PatientRecord::filter([ 'type_id' => request('type_id'), 'treat_range' => request('treat_range'), 'inviter_id' => request('id') ]); $salerQuery = PatientRecord::filter([ 'type_id' => request('type_id'), 'treat_range' => request('treat_range'), 'saler_id' => request('id') ]); $records_count = $doctorQuery->count() + $inviterQuery->count() + $salerQuery->count(); $doctor_money = $doctorQuery->sum('doctor_money'); $inviter_money = $inviterQuery->sum('inviter_money'); $saler_money = $salerQuery->sum('saler_money'); $total_money = round($doctor_money + $inviter_money + $saler_money, 2, PHP_ROUND_HALF_DOWN); // $allList = (clone $query)->get(); // $records_count = $allList->sum(fn ($item) => $item->doctors->count() + $item->inviters->count() + $item->salers->count()); // $doctor_money = round($allList->sum(fn ($item) => $item->doctors->sum('doctor_money')), 2, PHP_ROUND_HALF_DOWN); // $inviter_money = round($allList->sum(fn ($item) => $item->inviters->sum('inviter_money')), 2, PHP_ROUND_HALF_DOWN); // $saler_money = round($allList->sum(fn ($item) => $item->salers->sum('saler_money')), 2, PHP_ROUND_HALF_DOWN); // $total_money = round($allList->sum(fn ($item) => $item->salers->sum('saler_money') + $item->inviters->sum('inviter_money') + $item->doctors->sum('doctor_money')), 2, PHP_ROUND_HALF_DOWN); $total = $list->total(); $this->sortable($query); return compact('items', 'total', 'records_count', 'doctor_money', 'inviter_money', 'saler_money', 'total_money'); } }