Tenant SaaS müştərisidir: şirkət, komanda və ya mağaza. Multitenancy bir tətbiq və kod bazasının çoxlu tenant-a xidmət etməsi deməkdir, hər biri yalnız öz məlumatını görür.
Üç yanaşma
| Mövzu | Bir baza | Hər tenant üçün baza |
|---|---|---|
| İzolyasiya | məntiqi (scope) | fiziki |
| Migrasiya | bir dəfə | hər tenant üçün |
| Çox tenant | asan | baza sayı artır |
| Backup | ümumi | tenant üzrə |
| Hesabat | sadə | tenant-lar arası çətin |
💡 Bir baza və
tenant_idilə başlayın. Hər tenant üçün bazaya yalnız müqavilə, qayda və ya çox böyük müştəri tələb etdikdə keçin.
Bir baza: tenant_id və global scope
Tapılmış tenant-ı kiçik bir obyektdə saxlayın. Onu scoped kimi qeyd edin ki, hər sorğu və job üçün sıfırlansın.
namespace App\Support;
use App\Models\Tenant;
use RuntimeException;
final class CurrentTenant
{
private ?Tenant $tenant = null;
public function set(Tenant $tenant): void
{
$this->tenant = $tenant;
}
public function id(): int
{
return $this->tenant?->id
?? throw new RuntimeException('No tenant resolved');
}
}
// AppServiceProvider::register()
$this->app->scoped(CurrentTenant::class);namespace App\Models\Scopes;
use App\Support\CurrentTenant;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class TenantScope implements Scope
{
public function apply(Builder $builder, Model $model): void
{
$builder->where(
$model->getTable().'.tenant_id',
app(CurrentTenant::class)->id(),
);
}
}namespace App\Models\Concerns;
trait BelongsToTenant
{
protected static function bootBelongsToTenant(): void
{
static::addGlobalScope(new TenantScope);