반응형
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);
이렇게 호출함...
반응형
'PHP' 카테고리의 다른 글
| [라라벨]mysql 쿼리를 챗지피티와 제미나이를 이용해 orm으로 변경하기 (0) | 2025.06.23 |
|---|---|
| [라라벨]이전글, 다음글 한방에 가져오기 (0) | 2025.06.05 |
| [라라벨]라라벨에 엘라스틱서치 연동하기 (0) | 2025.05.27 |
| [라라벨]쿼리에 함수를 쓸때 whereRaw (0) | 2025.05.22 |
| [라라벨]쿼리문 and와 or 혼용해서 쓰기 (0) | 2024.08.01 |