PHP
[라라벨]ORM 안쓰고 일반 쿼리로 라라벨 페이징이랑 호환되는 함수
에스크리토
2025. 12. 9. 10:41
반응형
use Illuminate\Support\Facades\DB;
use Illuminate\Pagination\LengthAwarePaginator;
function paginateSmart(string $sql, array $bindings = [], int $perPage = 100)
{
// 현재 페이지
$page = LengthAwarePaginator::resolveCurrentPage();
// 전체 개수 구하는 쿼리 (원본 SQL을 서브쿼리로 감쌈)
$countSql = "SELECT COUNT(*) AS cnt FROM ({$sql}) AS sub";
$countRow = DB::selectOne($countSql, $bindings);
$total = (int) ($countRow->cnt ?? 0);
// 페이지 아이템 가져오기용 LIMIT / OFFSET
$offset = ($page - 1) * $perPage;
$items = DB::select(
$sql . " LIMIT ? OFFSET ?",
array_merge($bindings, [$perPage, $offset])
);
// 라라벨 기본 paginator랑 동일한 객체 리턴
return new LengthAwarePaginator(
$items,
$total,
$perPage,
$page,
[
'path' => request()->url(),
'query' => request()->query(), // withQueryString() 같이 쓰려고
]
);
}
이렇게 Helpers에 함수 만들고
$sql = "
SELECT *
FROM test
WHERE aaa = ?
ORDER BY id DESC
";
$results = paginateSmart($sql, [$aaa], 10);
이렇게 호출함...
반응형