Scope all queries and mutations by tenant using global scopes and middleware-set tenant context.
Multi-tenancy
// Tenant-aware middleware
class SetTenant {
public function handle(Request $request, Closure $next) {
$domain = $request->getHost();
$tenant = Tenant::where("domain", $domain)->firstOrFail();
app()->instance("tenant", $tenant);
config(["database.connections.tenant.database" => $tenant->database]);
DB::reconnect("tenant");
return $next($request);
}
}
// Scoped queries using global scope
class TenantScope implements Scope {
public function apply(Builder $builder, Model $model): void {
$builder->where("tenant_id", app("tenant")->id);
}
}
class Post extends Model {
protected static function booted(): void {
static::addGlobalScope(new TenantScope());
static::creating(fn($m) => $m->tenant_id = app("tenant")->id);
}
}