반응형
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);
 
이렇게 호출함...
반응형

+ Recent posts