PHPackages                             pg-tenancy/laravel-pg-tenancy - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. pg-tenancy/laravel-pg-tenancy

ActiveLibrary[Database &amp; ORM](/categories/database)

pg-tenancy/laravel-pg-tenancy
=============================

Laravel multi-tenancy for PostgreSQL schema isolation with connection pooling (subdomain, path, team modes)

03PHP

Since Aug 11Pushed 9mo agoCompare

[ Source](https://github.com/WouterLagerwerf/laravel-pg-tenancy)[ Packagist](https://packagist.org/packages/pg-tenancy/laravel-pg-tenancy)[ RSS](/packages/pg-tenancy-laravel-pg-tenancy/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Laravel PG Tenancy
==================

[](#laravel-pg-tenancy)

Multi-tenancy for Laravel with PostgreSQL schema isolation and connection pooling. Supports subdomain, path, or Team model based tenancy modes.

Installation
------------

[](#installation)

1. Require the package (adjust VCS path if local):

```
composer require pg-tennancy/laravel-pg-tenancy
```

2. Publish config and migrations:

```
php artisan vendor:publish --provider="PgTenancy\\PgTenancyServiceProvider" --tag=tenancy-config
php artisan vendor:publish --provider="PgTenancy\\PgTenancyServiceProvider" --tag=tenancy-migrations
php artisan vendor:publish --provider="PgTenancy\\PgTenancyServiceProvider" --tag=tenancy-tenant-migrations
```

3. Configure `config/tenancy.php` and ensure a privileged `system_connection` can create schemas/roles.
4. Add middleware to HTTP kernel or route group:

```
// app/Http/Kernel.php
protected $middlewareGroups = [
    'web' => [
        // ...
        \PgTenancy\Http\Middleware\IdentifyTenant::class,
    ],
];
```

Modes
-----

[](#modes)

- Subdomain: `tenant1.example.com` (configure `base_domain`)
- Path: `example.com/tenant1` (configure `path_segment_index`)
- Team: authenticated user's team (configure relation name)

Schema Isolation
----------------

[](#schema-isolation)

Each tenant gets its own PostgreSQL schema and role. The package sets the Postgres `search_path` to `{schema},public` on a per-request tenant connection.

Commands
--------

[](#commands)

- `php artisan tenancy:tenant:create {slug} {--domain=} {--schema=} {--team-id=}`
- `php artisan tenancy:tenant:delete {id-or-slug}`
- `php artisan tenancy:migrate {--fresh} {--seed}`

Tests
-----

[](#tests)

```
composer test
```

License
-------

[](#license)

MIT

Programmatic Tenant Creation (Sign-up)
--------------------------------------

[](#programmatic-tenant-creation-sign-up)

Preferred flow: create a User, then create a Team for that user. The package provisions the tenant schema via the Team observer and automatically runs tenant migrations.

```
use PgTenancy\Models\Team;

// After creating $user
$team = Team::createForUser('Acme Inc', $user);
// A tenant record is created and schema is provisioned automatically (observer)
```

Add tenancy to your registration flow (Livewire Volt example)
-------------------------------------------------------------

[](#add-tenancy-to-your-registration-flow-livewire-volt-example)

1. Ensure team-based tenancy mode:

```
// config/tenancy.php
return [
    'mode' => 'team',
];
```

2. Register route middleware so tenancy resolves after auth:

```
// bootstrap/app.php
->withMiddleware(function (\Illuminate\Foundation\Configuration\Middleware $middleware) {
    $middleware->alias([
        'tenant' => \PgTenancy\Http\Middleware\IdentifyTenant::class,
    ]);
})

// routes/web.php
Route::view('dashboard', 'dashboard')->middleware(['auth', 'tenant', 'verified']);
```

3. Extend your register component to accept a team name and create the team after user creation:

```
// resources/views/livewire/auth/register.blade.php (excerpt)
use PgTenancy\\Models\\Team;

public string $team_name = '';

public function register(): void
{
    // ... validate + create $user + Auth::login($user)
    $teamName = trim($this->team_name) !== '' ? $this->team_name : ($user->name . "'s Team");
    Team::createForUser($teamName, $user);
    // redirect to dashboard
}

// Add an input to the form

```

4. Show current tenant schema (optional):

```
// resources/views/dashboard.blade.php (excerpt)
$schemaName = DB::selectOne('select current_schema() as schema')->schema ?? null;
```

Notes:

- On `TenantCreated`, the package runs tenant migrations in `database/migrations/tenant` on the tenant connection.
- Team slugs and tenant schemas are made unique automatically (even for duplicate team names).

###  Health Score

16

—

LowBetter than 5% of packages

Maintenance41

Moderate activity, may be stable

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/11dbd186c89656fee9efbf5ba19762f279ddfcd4c9d11c448cceb6332ec8ed24?d=identicon)[WouterLagerwerf](/maintainers/WouterLagerwerf)

---

Top Contributors

[![WouterLagerwerf](https://avatars.githubusercontent.com/u/43637154?v=4)](https://github.com/WouterLagerwerf "WouterLagerwerf (5 commits)")

### Embed Badge

![Health badge](/badges/pg-tenancy-laravel-pg-tenancy/health.svg)

```
[![Health](https://phpackages.com/badges/pg-tenancy-laravel-pg-tenancy/health.svg)](https://phpackages.com/packages/pg-tenancy-laravel-pg-tenancy)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

90340.3M211](/packages/ramsey-uuid-doctrine)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
