giftcon_dev/app/Repositories/Admin/Log/MemberPasswdModifyLogRepository.php

86 lines
2.7 KiB
PHP

<?php
namespace App\Repositories\Admin\Log;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
final class MemberPasswdModifyLogRepository
{
private const TABLE = 'mem_passwd_modify';
public function paginate(array $filters, int $perPage = 30): LengthAwarePaginator
{
$q = DB::table(self::TABLE . ' as p')
->select(['p.seq', 'p.state', 'p.info', 'p.rgdate']);
// 기간
if (!empty($filters['date_from'])) {
$q->where('p.rgdate', '>=', $filters['date_from'] . ' 00:00:00');
}
if (!empty($filters['date_to'])) {
$q->where('p.rgdate', '<=', $filters['date_to'] . ' 23:59:59');
}
// state
if (!empty($filters['state'])) {
$q->where('p.state', $filters['state']);
}
// mem_no (JSON)
if (($filters['mem_no'] ?? null) !== null) {
$q->whereRaw(
"JSON_UNQUOTE(JSON_EXTRACT(p.info, '$.mem_no')) = ?",
[(string)((int)$filters['mem_no'])]
);
}
// type (신포맷)
$type = trim((string)($filters['type'] ?? ''));
if ($type !== '') {
$q->whereRaw(
"JSON_UNQUOTE(JSON_EXTRACT(p.info, '$.type')) = ?",
[$type]
);
}
// email (구포맷)
$email = trim((string)($filters['email'] ?? ''));
if ($email !== '') {
$like = '%' . $this->escapeLike($email) . '%';
$q->where(function ($qq) use ($like) {
$qq->whereRaw("JSON_UNQUOTE(JSON_EXTRACT(p.info, '$.user_email')) LIKE ?", [$like])
->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(p.info, '$.email')) LIKE ?", [$like]);
});
}
// ip: 신포맷 remote_addr prefix OR 구포맷 auth_key/info contains
$ip = trim((string)($filters['ip'] ?? ''));
if ($ip !== '') {
$like = $this->escapeLike($ip) . '%';
$like2 = '%' . $this->escapeLike($ip) . '%';
$q->where(function ($qq) use ($like, $like2) {
$qq->whereRaw("JSON_UNQUOTE(JSON_EXTRACT(p.info, '$.remote_addr')) LIKE ?", [$like])
->orWhere('p.info', 'like', $like2);
});
}
// q: info 전체 검색(필요할 때만)
$kw = trim((string)($filters['q'] ?? ''));
if ($kw !== '') {
$q->where('p.info', 'like', '%' . $this->escapeLike($kw) . '%');
}
$q->orderByDesc('p.rgdate')->orderByDesc('p.seq');
return $q->paginate($perPage)->withQueryString();
}
private function escapeLike(string $s): string
{
return str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $s);
}
}