spatie/laravel-multitenancy
Unopinionated multitenancy for Laravel. Detect the current tenant per request and define what happens when switching tenants. Supports single or multiple databases, tenant-aware queued jobs, commands that run per tenant, and easy per-model connection setup.
If you want to change or add behaviour on the Tenant model you can use your custom model. There are two ways of doing this by extending the Tenant model provided by the package, or by prepping a model of your own.
Tenant model provided by the packageMake sure that your custom model extends the Spatie\Multitenancy\Models\Tenant model provided by the package.
You should specify the class name of your model in the tenant_model key of the multitenancy config file.
/*
* This class is the model used for storing configuration on tenants.
*
* It must be or extend `Spatie\Multitenancy\Models\Tenant::class`
*/
'tenant_model' => \App\Models\CustomTenantModel::class,
You don't have to extend our Tenant model. For example if you use Laravel Jetstream, then you probably want to use Team model provided by that package as your tenant model.
To accomplish that, you can implement the IsTenant interface and use trait ImplementsTenant to fulfill that interface.
Here's an example:
namespace App\Models;
use Laravel\Jetstream\Team as JetstreamTeam;
use Spatie\Multitenancy\Contracts\IsTenant;
use Spatie\Multitenancy\Models\Concerns\ImplementsTenant;
class Team extends JetstreamTeam implements IsTenant
{
use HasFactory;
use UsesLandlordConnection;
use ImplementsTenant;
}
You can leverage Eloquent's lifecycle callbacks to execute extra logic when a tenant gets created, updated, deleted, ...
Here's an example on how you could call some logic that creates a database when a tenant gets created.
namespace App\Models\Tenant;
use Spatie\Multitenancy\Models\Tenant;
class CustomTenantModel extends Tenant
{
protected static function booted()
{
static::creating(fn(CustomTenantModel $model) => $model->createDatabase());
}
public function createDatabase()
{
// add logic to create database
}
}
How can I help you explore Laravel packages today?