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; }); $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'); } }