update: add indexes to audits to speed up staff activity counts

Speeds up the queries from 1.1 s to 75 ms.
This commit is contained in:
Roardom
2024-09-27 07:34:24 +00:00
parent 3649c27f1a
commit 3878bb85d7
3 changed files with 27 additions and 14 deletions
+12 -9
View File
@@ -18,6 +18,7 @@ namespace App\Http\Controllers\Staff;
use App\Http\Controllers\Controller;
use App\Models\Audit;
use App\Models\User;
use Exception;
/**
@@ -30,15 +31,17 @@ class AuditController extends Controller
*/
public function index(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View
{
return view('Staff.audit.index', ['staffActivities' => Audit::with(['user', 'user.group'])
->whereRelation('user.group', 'is_modo', '=', true)
->where('action', '!=', 'create') // Exclude audits with action 'create'
->select('user_id')
->selectRaw('COUNT(*) as total_actions')
->selectRaw('SUM(CASE WHEN created_at > NOW() - INTERVAL 60 DAY THEN 1 ELSE 0 END) as last_60_days')
->selectRaw('SUM(CASE WHEN created_at > NOW() - INTERVAL 30 DAY THEN 1 ELSE 0 END) as last_30_days')
->groupBy('user_id')
->get()]);
return view('Staff.audit.index', [
'staffUsers' => User::query()
->with(['group'])
->whereRelation('group', 'is_modo', '=', true)
->withCount([
'audits as total_actions' => fn ($query) => $query->where('action', '!=', 'create'),
'audits as last_60_days' => fn ($query) => $query->where('action', '!=', 'create')->whereBetween('created_at', [now()->subDays(60), now()]),
'audits as last_30_days' => fn ($query) => $query->where('action', '!=', 'create')->whereBetween('created_at', [now()->subDays(30), now()]),
])
->get()
]);
}
/**
+10
View File
@@ -947,6 +947,16 @@ class User extends Authenticatable implements MustVerifyEmail
return $this->hasMany(TorrentTrump::class);
}
/**
* Has Many Audits.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany<Audit, $this>
*/
public function audits(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(Audit::class);
}
/**
* Has many donations.
*
+5 -5
View File
@@ -35,14 +35,14 @@
</tr>
</thead>
<tbody>
@foreach ($staffActivities as $activity)
@foreach ($staffUsers as $staffUser)
<tr>
<td>
<x-user_tag :anon="false" :user="$activity->user" />
<x-user_tag :anon="false" :user="$staffUser" />
</td>
<td>{{ $activity->last_30_days }}</td>
<td>{{ $activity->last_60_days }}</td>
<td>{{ $activity->total_actions }}</td>
<td>{{ $staffUser->last_30_days }}</td>
<td>{{ $staffUser->last_60_days }}</td>
<td>{{ $staffUser->total_actions }}</td>
</tr>
@endforeach
</tbody>