This package extends Illuminate to provide partitioned table creation in migrations for PostgreSQL, MySQL and MariaDB.
We are ORPtech. Here at ORPtech, we pride ourselves in ensuring that clients and services have a peaceful, safe and smooth interaction. We know how difficult it is to build trust for a service, therefore we are here to help bridge the gaps within the market via our robust applications. Please contact us for further information on how our services might help your business.
| Package Version | Supported |
|---|---|
| 11.x.x | Laravel 11 |
| 12.x.x | Laravel 12 |
| 13.x.x | Laravel 13 |
You can install the package via composer:
composer require orptech/laravel-migration-partition- PostgreSQL
- MySQL
- MariaDB
- SQL Server 2017+
- SQLite 3.8.8+
The same API works for PostgreSQL, MySQL and MariaDB. The package picks the grammar from your connection's driver.
MySQL and MariaDB keep partitions inside the partitioned table instead of as separate tables, so a few things work differently:
- Range partitioned tables use
RANGE COLUMNSand get a{table}_defaultpartition for values belowMAXVALUE. New range partitions are split off from it, so create them in ascending order. Only the end value is used. UsedateTimerather thantimestampcolumns as range keys. - List partitioned tables use
LIST COLUMNSand get a{table}_defaultpartition that holdsNULL. Pass integers (not numeric strings) as list values for integer columns. - Hash partitioned tables use
KEYpartitioning. EachcreateHashPartitioncall adds one partition. MySQL ignores the modulus and remainder because it distributes rows itself. You can't attach or detach hash partitions. attachRangePartition/attachListPartitionadd a partition named after the table you pass and move that table's rows into it. The table stays behind, empty.detachPartitionmoves the partition's rows into a new table named after the partition, then drops the partition.- Every primary/unique key must include the partition column, as in PostgreSQL. You can keep
$table->id()with a composite key such as'id', 'created_at'.
PostgreSQL also known as Postgres, is a free and open-source relational database management system (RDBMS) emphasizing extensibility and SQL compliance.
Instead of importing Illuminate's Schema import this package's schema:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::createRangePartitioned('[YourTableNameHere]', function (Blueprint $table) {
//...
}, '[compositeKeyOne]', '[compositeKeyTwo]', '[rangePartitionKey]');Enter null for [compositeKeyOne], [compositeKeyTwo] if you don't need a primary key.
use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::createRangePartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[suffixForPartition]', '[startDate]', '[endDate]');use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::attachRangePartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[suffixForPartition]', '[startDate]', '[endDate]');use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::createListPartitioned('[YourTableNameHere]', function (Blueprint $table) {
//...
}, '[compositeKeyOne]', '[compositeKeyTwo]', '[listPartitionKey]');Enter null for [compositeKeyOne], [compositeKeyTwo] if you don't need a primary key.
use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::createListPartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[suffixForPartition]', '[listPartitionValue]');use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::attachListPartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[suffixForPartition]', '[listPartitionValue]');use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::createHashPartitioned('[YourTableNameHere]', function (Blueprint $table) {
//...
}, '[compositeKeyOne]', '[compositeKeyTwo]', '[hashPartitionKey]');Enter null for [compositeKeyOne], [compositeKeyTwo] if you don't need a primary key.
use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::createHashPartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[suffixForPartition]', '[hashModulus]', '[hashRemainder]');use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::attachHashPartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[suffixForPartition]', '[hashModulus]', '[hashRemainder]');use ORPTech\MigrationPartition\Database\Schema\Blueprint;
use ORPTech\MigrationPartition\Support\Facades\Schema;
Schema::detachPartition('[YourPartitionedTableNameHere]', function (Blueprint $table) {}, '[partitionTableName]');This command will create a new series of migrations for all range partitioned tables.
php artisan partition:rangeThis command will create a new series of migrations for all list partitioned tables.
php artisan partition:listThis command will create a new series of migrations for all hash partitioned tables.
php artisan partition:hashThis command will list all the partitioned tables.
php artisan partition:partitions- This package currently supports PostgreSQL Range Partitions.
- You shouldn't define any primary keys in your migration. The package creates a composite key while setting up the table.
- You need to create an initial partition to start using the tables. (PostgreSQL)
composer testPlease see CHANGELOG for more information on what has changed recently.
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.

