select([ 'l.seq', 'l.mem_no', 'l.request_data', 'l.result_data', 'l.request_time', 'l.result_time', ]); // 기간(요청시간 기준) if (!empty($filters['date_from'])) { $q->where('l.request_time', '>=', $filters['date_from'] . ' 00:00:00'); } if (!empty($filters['date_to'])) { $q->where('l.request_time', '<=', $filters['date_to'] . ' 23:59:59'); } // mem_no if (($filters['mem_no'] ?? null) !== null) { $q->where('l.mem_no', (int)$filters['mem_no']); } // bank_code (요청 JSON) $bank = trim((string)($filters['bank_code'] ?? '')); if ($bank !== '') { $q->whereRaw( "JSON_UNQUOTE(JSON_EXTRACT(l.request_data, '$.bank_code')) = ?", [$bank] ); } // status (결과 JSON) $status = trim((string)($filters['status'] ?? '')); if ($status !== '') { if ($status === 'ok') { $q->whereRaw("JSON_EXTRACT(l.result_data, '$.status') = 200"); } elseif ($status === 'fail') { $q->whereRaw("JSON_EXTRACT(l.result_data, '$.status') <> 200"); } elseif (ctype_digit($status)) { $q->whereRaw("JSON_EXTRACT(l.result_data, '$.status') = ?", [(int)$status]); } } // account (요청 JSON) - 부분검색 $account = trim((string)($filters['account'] ?? '')); if ($account !== '') { $like = '%' . $this->escapeLike($account) . '%'; $q->whereRaw( "JSON_UNQUOTE(JSON_EXTRACT(l.request_data, '$.account')) LIKE ?", [$like] ); } // name (요청 JSON: mam_accountname) $name = trim((string)($filters['name'] ?? '')); if ($name !== '') { $like = '%' . $this->escapeLike($name) . '%'; $q->whereRaw( "JSON_UNQUOTE(JSON_EXTRACT(l.request_data, '$.mam_accountname')) LIKE ?", [$like] ); } // q: request/result 전체 LIKE (운영에서 필요할 때만) $kw = trim((string)($filters['q'] ?? '')); if ($kw !== '') { $like = '%' . $this->escapeLike($kw) . '%'; $q->where(function ($qq) use ($like) { $qq->where('l.request_data', 'like', $like) ->orWhere('l.result_data', 'like', $like); }); } $q->orderByDesc('l.request_time')->orderByDesc('l.seq'); return $q->paginate($perPage)->withQueryString(); } private function escapeLike(string $s): string { return str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $s); } }