with(['deletedByUser', 'relations']) ->withCount('relations'); // 레코드 타입 필터 if (! empty($filters['record_type'])) { $query->where('record_type', $filters['record_type']); } // 삭제자 필터 if (! empty($filters['deleted_by'])) { $query->where('deleted_by', $filters['deleted_by']); } // 노트 유무 필터 if (isset($filters['has_notes'])) { if ($filters['has_notes'] === 'yes' || $filters['has_notes'] === '1') { $query->whereNotNull('notes')->where('notes', '!=', ''); } elseif ($filters['has_notes'] === 'no' || $filters['has_notes'] === '0') { $query->where(function ($q) { $q->whereNull('notes')->orWhere('notes', ''); }); } } // 검색 if (! empty($filters['search'])) { $search = $filters['search']; $query->where(function ($q) use ($search) { $q->where('record_type', 'like', "%{$search}%") ->orWhere('notes', 'like', "%{$search}%") ->orWhereRaw("JSON_EXTRACT(main_data, '$.name') LIKE ?", ["%{$search}%"]) ->orWhereRaw("JSON_EXTRACT(main_data, '$.title') LIKE ?", ["%{$search}%"]); }); } // 정렬 (기본: 삭제일시 내림차순) $sortBy = $filters['sort_by'] ?? 'deleted_at'; $sortDirection = $filters['sort_direction'] ?? 'desc'; $query->orderBy($sortBy, $sortDirection); return $query->paginate($perPage); } /** * 특정 아카이브 레코드 조회 */ public function getArchivedRecordById(int $id): ?ArchivedRecord { return ArchivedRecord::with(['deletedByUser', 'relations']) ->find($id); } /** * 삭제자 목록 조회 (필터용) */ public function getDeletedByUsers(): array { return ArchivedRecord::query() ->whereNotNull('deleted_by') ->with('deletedByUser:id,name') ->get() ->pluck('deletedByUser') ->filter() ->unique('id') ->values() ->toArray(); } /** * 아카이브 통계 */ public function getStats(): array { return [ 'total' => ArchivedRecord::count(), 'tenants' => ArchivedRecord::tenant()->count(), 'users' => ArchivedRecord::user()->count(), 'with_notes' => ArchivedRecord::whereNotNull('notes') ->where('notes', '!=', '') ->count(), ]; } }