{"id":33956626,"url":"https://github.com/lampager/lampager-laravel","last_synced_at":"2026-04-02T01:43:04.427Z","repository":{"id":46111720,"uuid":"106939637","full_name":"lampager/lampager-laravel","owner":"lampager","description":"Rapid pagination for Laravel","archived":false,"fork":false,"pushed_at":"2025-04-12T06:32:21.000Z","size":74,"stargazers_count":77,"open_issues_count":2,"forks_count":2,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-12T07:29:55.848Z","etag":null,"topics":["fast","laravel","pagination","paginator","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lampager.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-10-14T15:35:43.000Z","updated_at":"2025-04-12T06:32:02.000Z","dependencies_parsed_at":"2025-04-12T07:25:46.295Z","dependency_job_id":"fe463c4c-7eae-474c-bcd6-82422cdeab00","html_url":"https://github.com/lampager/lampager-laravel","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/lampager/lampager-laravel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-laravel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-laravel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-laravel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-laravel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lampager","download_url":"https://codeload.github.com/lampager/lampager-laravel/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lampager%2Flampager-laravel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31294100,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T01:05:07.454Z","status":"ssl_error","status_checked_at":"2026-04-02T00:56:46.496Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fast","laravel","pagination","paginator","php"],"created_at":"2025-12-12T20:41:17.115Z","updated_at":"2026-04-02T01:43:04.422Z","avatar_url":"https://github.com/lampager.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg width=\"320\" alt=\"lampager-laravel\" src=\"https://user-images.githubusercontent.com/1351893/31755018-9ab0c8ae-b4d6-11e7-9310-dbc372998ee4.png\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/lampager/lampager-laravel/actions\"\u003e\u003cimg src=\"https://github.com/lampager/lampager-laravel/actions/workflows/test.yml/badge.svg?branch=master\" alt=\"Build Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://coveralls.io/github/lampager/lampager-laravel?branch=master\"\u003e\u003cimg src=\"https://coveralls.io/repos/github/lampager/lampager-laravel/badge.svg?branch=master\" alt=\"Coverage Status\"\u003e\u003c/a\u003e\n\n# Lampager for Laravel\n\nRapid pagination without using OFFSET\n\n\u003e [!CAUTION]\n\u003e **Now Laravel officialy supports Cursor Pagination as of v8.41. Please don't use if you install such versions unless you choose `SQLServer` as RDBMS.**\n\u003e - **[Highly Performant Cursor Pagination in Laravel 8.41 | Laravel News](https://laravel-news.com/cursor-pagination)**\n\u003e - **[SQL Feature Comparison](https://www.sql-workbench.eu/dbms_comparison.html)** (See \"Tuple Comparison\" section)\n\n## Requirements\n\n\u003e [!NOTE]\n\u003e Older versions have outdated dependency requirements. If you cannot prepare the latest environment, please refer to past releases.\n\n- PHP: `^8.2`\n- Laravel: `^11.0 || ^12.0`\n- [lampager/lampager](https://github.com/lampager/lampager): `^0.5`\n\n## Installing\n\n```bash\ncomposer require lampager/lampager-laravel\n```\n\n## Basic Usage\n\nRegister service provider.\n\n`config/app.php`:\n\n```php\n        /*\n         * Package Service Providers...\n         */\n        Lampager\\Laravel\\MacroServiceProvider::class,\n```\n\nThen you can chain `-\u003elampager()` method from Query Builder, Eloquent Builder and Relation.\n\n```php\n$cursor = [\n    'id' =\u003e 3,\n    'created_at' =\u003e '2017-01-10 00:00:00',\n    'updated_at' =\u003e '2017-01-20 00:00:00',\n];\n\n$result = App\\Post::whereUserId(1)\n    -\u003elampager()\n    -\u003eforward()\n    -\u003elimit(5)\n    -\u003eorderByDesc('updated_at') // ORDER BY `updated_at` DESC, `created_at` DESC, `id` DESC\n    -\u003eorderByDesc('created_at')\n    -\u003eorderByDesc('id')\n    -\u003eseekable()\n    -\u003epaginate($cursor)\n    -\u003etoJson(JSON_PRETTY_PRINT);\n```\n\nIt will run the optimized query.\n\n\n```sql\n(\n\n    SELECT * FROM `posts`\n    WHERE `user_id` = 1\n    AND (\n        `updated_at` = '2017-01-20 00:00:00' AND `created_at` = '2017-01-10 00:00:00' AND `id` \u003e 3\n        OR\n        `updated_at` = '2017-01-20 00:00:00' AND `created_at` \u003e '2017-01-10 00:00:00'\n        OR\n        `updated_at` \u003e '2017-01-20 00:00:00'\n    )\n    ORDER BY `updated_at` ASC, `created_at` ASC, `id` ASC\n    LIMIT 1\n\n) UNION ALL (\n\n    SELECT * FROM `posts`\n    WHERE `user_id` = 1\n    AND (\n        `updated_at` = '2017-01-20 00:00:00' AND `created_at` = '2017-01-10 00:00:00' AND `id` \u003c= 3\n        OR\n        `updated_at` = '2017-01-20 00:00:00' AND `created_at` \u003c '2017-01-10 00:00:00'\n        OR\n        `updated_at` \u003c '2017-01-20 00:00:00'\n    )\n    ORDER BY `updated_at` DESC, `created_at` DESC, `id` DESC\n    LIMIT 6\n\n)\n```\n\nAnd you'll get\n\n\n```json\n{\n  \"records\": [\n    {\n      \"id\": 3,\n      \"user_id\": 1,\n      \"text\": \"foo\",\n      \"created_at\": \"2017-01-10 00:00:00\",\n      \"updated_at\": \"2017-01-20 00:00:00\"\n    },\n    {\n      \"id\": 5,\n      \"user_id\": 1,\n      \"text\": \"bar\",\n      \"created_at\": \"2017-01-05 00:00:00\",\n      \"updated_at\": \"2017-01-20 00:00:00\"\n    },\n    {\n      \"id\": 4,\n      \"user_id\": 1,\n      \"text\": \"baz\",\n      \"created_at\": \"2017-01-05 00:00:00\",\n      \"updated_at\": \"2017-01-20 00:00:00\"\n    },\n    {\n      \"id\": 2,\n      \"user_id\": 1,\n      \"text\": \"qux\",\n      \"created_at\": \"2017-01-17 00:00:00\",\n      \"updated_at\": \"2017-01-18 00:00:00\"\n    },\n    {\n      \"id\": 1,\n      \"user_id\": 1,\n      \"text\": \"quux\",\n      \"created_at\": \"2017-01-16 00:00:00\",\n      \"updated_at\": \"2017-01-18 00:00:00\"\n    }\n  ],\n  \"has_previous\": false,\n  \"previous_cursor\": null,\n  \"has_next\": true,\n  \"next_cursor\": {\n    \"updated_at\": \"2017-01-18 00:00:00\",\n    \"created_at\": \"2017-01-14 00:00:00\",\n    \"id\": 6\n  }\n}\n```\n\n## Resource Collection\n\nLampager supports Laravel's API Resources.\n\n- [Eloquent: API Resources - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/6.x/eloquent-resources)\n\nUse helper traits on Resource and ResourceCollection.\n\n```php\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\nuse Lampager\\Laravel\\LampagerResourceTrait;\n\nclass PostResource extends JsonResource\n{\n    use LampagerResourceTrait;\n}\n```\n\n```php\nuse Illuminate\\Http\\Resources\\Json\\ResourceCollection;\nuse Lampager\\Laravel\\LampagerResourceCollectionTrait;\n\nclass PostResourceCollection extends ResourceCollection\n{\n    use LampagerResourceCollectionTrait;\n}\n```\n\n```php\n$posts = App\\Post::lampager()\n    -\u003eorderByDesc('id')\n    -\u003epaginate();\n\nreturn new PostResourceCollection($posts);\n```\n\n```json5\n{\n  \"data\": [/* ... */],\n  \"has_previous\": false,\n  \"previous_cursor\": null,\n  \"has_next\": true,\n  \"next_cursor\": {/* ... */}\n}\n```\n\n## Classes\n\nNote: See also [lampager/lampager](https://github.com/lampager/lampager).\n\n| Name | Type | Parent Class | Description |\n|:---|:---|:---|:---|\n| Lampager\\\\Laravel\\\\`Paginator` | Class | Lampager\\\\`Paginator` | Fluent factory implementation for Laravel |\n| Lampager\\\\Laravel\\\\`Processor` | Class | Lampager\\\\`AbstractProcessor` | Processor implementation for Laravel |\n| Lampager\\\\Laravel\\\\`PaginationResult` | Class | Lampager\\\\`PaginationResult` | PaginationResult implementation for Laravel |\n| Lampager\\\\Laravel\\\\`MacroServiceProvider` | Class | Illuminate\\\\Support\\\\`ServiceProvider` | Enable macros chainable from QueryBuilder, ElqouentBuilder and Relation |\n| Lampager\\\\Laravel\\\\`LampagerResourceTrait` | Trait | | Support for Laravel JsonResource |\n| Lampager\\\\Laravel\\\\`LampagerResourceCollectionTrait` | Trait | | Support for Laravel ResourceCollection |\n\n`Paginator`, `Processor` and `PaginationResult` are macroable.\n\n## API\n\nNote: See also [lampager/lampager](https://github.com/lampager/lampager).\n\n### Paginator::__construct()\u003cbr\u003ePaginator::create()\n\nCreate a new paginator instance.  \nIf you use Laravel macros, however, you don't need to directly instantiate.\n\n```php\nstatic Paginator create(QueryBuilder|EloquentBuilder|Relation $builder): static\nPaginator::__construct(QueryBuilder|EloquentBuilder|Relation $builder)\n```\n\n- `QueryBuilder` means `\\Illuminate\\Database\\Query\\Builder`\n- `EloquentBuilder` means `\\Illuminate\\Database\\Eloquent\\Builder`\n- `Relation` means `\\Illuminate\\Database\\Eloquent\\Relation`\n\n### Paginator::transform()\n\nTransform Lampager Query into Illuminate builder.\n\n```php\nPaginator::transform(Query $query): QueryBuilder|EloquentBuilder|Relation\n```\n\n### Paginator::build()\n\nPerform configure + transform.\n\n```php\nPaginator::build(\\Lampager\\Contracts\\Cursor|array $cursor = []): QueryBuilder|EloquentBuilder|Relation\n```\n\n### Paginator::paginate()\n\nPerform configure + transform + process.\n\n```php\nPaginator::paginate(\\Lampager\\Contracts\\Cursor|array $cursor = []): \\Lampager\\Laravel\\PaginationResult\n```\n\n#### Arguments\n\n- **`(mixed)`** __*$cursor*__\u003cbr\u003e An associative array that contains `$column =\u003e $value` or an object that implements `\\Lampager\\Contracts\\Cursor`. It must be **all-or-nothing**.\n  - For initial page, omit this parameter or pass empty array.\n  - For subsequent pages, pass all parameters. Partial parameters are not allowd.\n\n#### Return Value\n\ne.g. \n\n(Default format when using `\\Illuminate\\Database\\Eloquent\\Builder`)\n\n```php\nobject(Lampager\\Laravel\\PaginationResult)#1 (5) {\n  [\"records\"]=\u003e\n  object(Illuminate\\Database\\Eloquent\\Collection)#2 (1) {\n    [\"items\":protected]=\u003e\n    array(5) {\n      [0]=\u003e\n      object(App\\Post)#2 (26) { ... }\n      [1]=\u003e\n      object(App\\Post)#3 (26) { ... }\n      [2]=\u003e\n      object(App\\Post)#4 (26) { ... }\n      [3]=\u003e\n      object(App\\Post)#5 (26) { ... }\n      [4]=\u003e\n      object(App\\Post)#6 (26) { ... }\n    }\n  }\n  [\"hasPrevious\"]=\u003e\n  bool(false)\n  [\"previousCursor\"]=\u003e\n  NULL\n  [\"hasNext\"]=\u003e\n  bool(true)\n  [\"nextCursor\"]=\u003e\n  array(2) {\n    [\"updated_at\"]=\u003e\n    string(19) \"2017-01-18 00:00:00\"\n    [\"created_at\"]=\u003e\n    string(19) \"2017-01-14 00:00:00\"\n    [\"id\"]=\u003e\n    int(6)\n  }\n}\n```\n\n### Paginator::useFormatter()\u003cbr\u003ePaginator::restoreFormatter()\u003cbr\u003ePaginator::process()\n\nInvoke Processor methods.\n\n```php\nPaginator::useFormatter(Formatter|callable $formatter): $this\nPaginator::restoreFormatter(): $this\nPaginator::process(\\Lampager\\Query $query, \\Illuminate\\Support\\Collection|\\Illuminate\\Database\\Eloquent\\Collection $rows): \\Lampager\\Laravel\\PaginationResult\n```\n\n### PaginationResult::toArray()\u003cbr\u003ePaginationResult::jsonSerialize()\n\nConvert the object into array.\n\n**IMPORTANT: `camelCase` properties are converted into `snake_case` form.**\n\n```php\nPaginationResult::toArray(): array\nPaginationResult::jsonSerialize(): array\n```\n\n### PaginationResult::__call()\n\nCall macro or Collection methods.\n\n```php\nPaginationResult::__call(string $name, array $args): mixed\n```\n\ne.g.\n\n```php\nPaginationResult::macro('foo', function () {\n    return ...;\n});\n$foo = $result-\u003efoo();\n```\n\n```php\n$first = $result-\u003efirst();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flampager%2Flampager-laravel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flampager%2Flampager-laravel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flampager%2Flampager-laravel/lists"}