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

Üç yanaşma
Üç yanaşma
MövzuBir bazaHər tenant üçün baza
İzolyasiyaməntiqi (scope)fiziki
Migrasiyabir dəfəhər tenant üçün
Çox tenantasanbaza sayı artır
Backupümumitenant üzrə
Hesabatsadətenant-lar arası çətin

💡 Bir baza və tenant_id ilə 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.

php
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);
php
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(),
        );
    }
}
php
namespace App\Models\Concerns;

trait BelongsToTenant
{
    protected static function bootBelongsToTenant(): void
    {
        static::addGlobalScope(new TenantScope);