# لوحة تحكم Laravel متعددة المستأجرين مع Laravilt: قاعدة بيانات واحدة أم قاعدة لكل مستأجر

> يمكن للوحات Laravilt أن تدعم تعدد المستأجرين بطريقتين: سجلات مرتبطة بفريق داخل قاعدة واحدة، أو قاعدة بيانات ونطاق فرعي منفصلان لكل مستأجر. كيف تضبط كلًّا منهما وكيف تختار.

*2026-10-12T12:32:35Z*

كل لوحة تحكم لمنتج SaaS تصل مبكرًا إلى السؤال نفسه: كيف تفصل بيانات عميل عن بيانات عميل آخر؟ تجيب لوحات Laravilt عنه داخل الـ Panel Provider، بأحد نمطين لتعدد المستأجرين.

**الإجابة المختصرة:** في معظم التطبيقات استخدم **قاعدة بيانات واحدة**: استدعِ `->tenant(Team::class, 'team', 'slug')` على اللوحة، فتُربط السجلات تلقائيًا بالفريق الحالي على المسار `/admin/{tenant}/...`. وعندما تحتاج عزلًا صارمًا أو التزامًا بمتطلبات نظامية أو نسخًا احتياطيًا لكل مستأجر، استخدم **قاعدة لكل مستأجر**: يعطي `->multiDatabaseTenancy(Tenant::class, 'myapp.com')` كل مستأجر قاعدة بيانات ونطاقًا فرعيًا خاصين به، تديرهما بالأمرين `tenant:create` و`tenants:migrate`.

## النمطان

| النمط | كيف تُخزّن البيانات | المسارات |
|------|-------------|---------|
| قاعدة واحدة | قاعدة مشتركة، والسجلات مرتبطة بمستأجر | مسار: `/admin/{tenant}/...` |
| قواعد متعددة | قاعدة منفصلة لكل مستأجر | نطاق فرعي: `{tenant}.myapp.com/admin/...` |

## قاعدة واحدة: الفرق كمستأجرين

انشر ملف migration الفرق والنموذج والـ trait، ثم شغّل migrate:

```bash
php artisan vendor:publish --tag=laravilt-teams-migration
php artisan vendor:publish --tag=laravilt-teams-model   # app/Models/Team.php
php artisan vendor:publish --tag=laravilt-teams-trait   # app/Concerns/HasTeams.php
php artisan migrate
```

ينفّذ نموذج `User` الواجهتين `HasTenants` و`HasDefaultTenant` ويستخدم الـ trait المسمى `HasTeams`، الذي يوفّر `teams()` و`currentTeam()` و`switchTeam()` و`ownsTeam()` و`teamRole()`، والدوال التي تحتاجها اللوحة لتقرر من يستطيع فتح أي مستأجر.

ثم فعّله في اللوحة:

```php
use App\Models\Team;
use Laravilt\Panel\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        ->tenant(Team::class, 'team', 'slug')   // model, ownership relationship, slug attribute
        ->tenantRegistration()
        ->tenantProfile();
}
```

تُربط الموارد بالفريق الحالي تلقائيًا. يتيح `tenantRegistration()` للمستخدمين إنشاء فريق، ويعطي `tenantProfile()` أصحاب الفرق صفحة إعدادات على `/{panel}/tenant-settings` لإدارة الاسم والأعضاء.

## قواعد متعددة: قاعدة لكل مستأجر

انشر ملف الإعدادات وملفات migration لجداول `tenants` و`domains` وجداول مستخدمي المستأجرين في القاعدة المركزية:

```bash
php artisan vendor:publish --tag=laravilt-tenancy-config
php artisan vendor:publish --tag=laravilt-tenancy-migrations
php artisan migrate
```

ثم حدّد للوحة أين يعيش كل نموذج:

```php
use Laravilt\Panel\Models\Tenant;

public function panel(Panel $panel): Panel
{
    return $panel
        ->multiDatabaseTenancy(Tenant::class, 'myapp.com')
        ->tenantModels([
            \App\Models\Customer::class,
            \App\Models\Product::class,
        ])
        ->centralModels([
            \App\Models\User::class,
            \App\Models\Plan::class,
        ])
        ->tenantRegistration()
        ->tenantProfile()
        ->tenantMenu();
}
```

نماذج `tenantModels()` تعيش في قاعدة بيانات كل مستأجر، ونماذج `centralModels()` مثل المستخدمين والخطط تبقى في القاعدة المركزية. ويضيف `tenantMenu()` أداة للتبديل بين المستأجرين.

وتُدار المستأجرون من سطر الأوامر:

```bash
php artisan tenant:create "Acme Corp" --slug=acme --email=admin@acme.com --seed
php artisan tenants:migrate                       # كل المستأجرين
php artisan tenants:migrate --tenant=acme --fresh --seed
php artisan tenant:delete acme --keep-database
```

يقرأ ملف الإعدادات `config/laravilt-tenancy.php` النمط من `TENANCY_MODE`، وبادئة أسماء قواعد المستأجرين من `TENANT_DB_PREFIX` (والافتراضي `tenant_`).

## كيف تختار

**القاعدة الواحدة** تناسب التطبيقات الصغيرة والمتوسطة، وتُبقي العبء على قاعدة البيانات منخفضًا، وتصلح عندما يتشارك المستأجرون بعض البيانات.

**القواعد المتعددة** تناسب من يحتاج عزلًا صارمًا للبيانات، أو لديه متطلبات نظامية، أو يريد نسخ مستأجر واحد احتياطيًا أو استعادته أو توسيعه وحده.

إن لم تكن متأكدًا، ابدأ بالقاعدة الواحدة، فهي أبسط في التشغيل، وكثير من منتجات SaaS لا تحتاج أبدًا إلى أكثر من ذلك.

## حدود بصراحة

- **القواعد المتعددة تعني تشغيلًا أكثر.** كل migration يعمل مرة لكل مستأجر، والنسخ الاحتياطي والمراقبة وحدود الاتصالات كلها تزيد مع عدد المستأجرين.
- **الانتقال بين النمطين هو نقل بيانات.** إعدادات اللوحة تتغير في بضعة أسطر، لكن نقل السجلات الموجودة إلى قواعد منفصلة (أو العكس) عمل حقيقي، فاختر مبكرًا.
- **Laravilt حديث.** إن كنت تحتاج اليوم إلى مجموعة كبيرة من إضافات تعدد المستأجرين الجاهزة، فتحقق مما هو متاح أولًا.

## الأسئلة الشائعة

### هل يدعم Laravilt تعدد المستأجرين؟
نعم. يدعم قاعدة بيانات واحدة تُربط فيها السجلات بمستأجر مثل الفريق، وقواعد متعددة بقاعدة ونطاق فرعي منفصلين لكل مستأجر.

### كيف أجعل الفرق هي المستأجرين في لوحة تحكم Laravel؟
انشر migration الفرق والنموذج والـ trait من Laravilt، وأضف `HasTeams` إلى نموذج `User`، واستدعِ `->tenant(Team::class, 'team', 'slug')` على اللوحة.

### هل يمكن أن يكون لكل مستأجر قاعدة بيانات خاصة؟
نعم. استخدم `->multiDatabaseTenancy(Tenant::class, 'myapp.com')`، فيحصل كل مستأجر على قاعدة خاصة ونطاق فرعي مثل `acme.myapp.com`.

### كيف أشغّل migrations لكل المستأجرين؟
شغّل `php artisan tenants:migrate`، وأضف `--tenant=acme` لمستأجر واحد، و`--fresh --seed` لإعادة بنائه.

## الخطوة التالية

- [توثيق تعدد المستأجرين](/ar/docs/panel/tenancy) · [الفرق كمستأجرين](/ar/docs/panel/tenancy/teams)
- [Laravilt أم Filament](/ar/blog/laravilt-vs-filament)
- [العرض الحي](https://demo.laravilt.com)

تبني منتج SaaS متعدد المستأجرين بـ Laravel؟ أصمم هذه المنتجات وأبنيها، بما في ذلك العمل باسم الوكالات (White-Label). اطّلع على [هندسة المنتجات](https://fadymondy.com/ar/services/product-engineering?utm_source=laravilt&utm_medium=referral&utm_campaign=seo-content-oct26) أو [تواصل معي](https://fadymondy.com/ar/contact?utm_source=laravilt&utm_medium=referral&utm_campaign=seo-content-oct26).

---

Source: https://laravilt.com/ar/blog/laravel-multi-tenant-admin-panel-laravilt
