sql >> Databáze >  >> RDS >> Mysql

Jak použít orchestrální/tenanti v Laravel 5 k vytvoření aplikace pro více tenantů s více databázemi?

+1 pro odpověď @morphatic, je u většiny věcí zcela přesná.

Migrace

Pro vaši hlavní databázi byste měli být schopni použít výchozí database/migration a použijte php artisan make:migration a php artisan migrate .

Tenanti však použije cestu migrace nastavenou v konfiguraci „ovladače“. např.:

'path' => database_path('tenanti/user'),

V tomto případě bude migrace vytvořena/migrována z database/tenanti/user (můžete si vybrat jinou složku a ta použije tuto složku). Jakmile toto nastavíte, můžete vytvořit nový migrační soubor pro uživatelského tenanta pomocí php artisan tenanti:make user create_blogs_table (jako příklad) a spusťte migraci pomocí php artisan tenanti:migrate user (viz podobnost mezi příkazem migrace Laravel a Tenanti?).

Ovladač

Driver je pouze seskupení tenanta, můžete ho seskupovat podle uživatelů, společností nebo týmu atd. A existuje možnost, že budete potřebovat více než jeden typ skupiny na projekt, jinak většinou používáte pouze jeden " skupina“ nebo „řidič“.

Autentizace nebo přístup k DB

Nejprve musíte zvážit, jak plánujete rozlišovat jednotlivé nájemníky. Většinu času bych viděl, že lidé mají tendenci se rozhodovat pro subdoménu. Takže v tomto případě musíte zkontrolovat, zda subdoména patří některému z uživatelů (dotazem na hlavní databázi) pomocí middlewaru a poté se připojit k databázi, která patří uživateli.

Tenanti tuto část procesu nespravuje, protože každý má v tomto ohledu jiný styl, ale poskytujeme kód pro dynamické připojení k vašemu tenantovi databáze ze základní konfigurace databáze.

Řekněme, že máte následující konfiguraci:

<?php

return [
    'fetch' => PDO::FETCH_CLASS,
    'default' => 'primary',
    'connections' => [
        'primary' => [
            //
        ],
        'tenants' => [
                'driver'    => 'mysql',
                'host'      => 'dbhost',     // for user with id=1
                'username'  => 'dbusername', // for user with id=1
                'password'  => 'dbpassword', // for user with id=1
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
                'strict'    => false,
            ],
       ],
    ],
    'migrations' => 'migrations',
    'redis' => [ ... ],
];

Můžete postupovat podle kroku dostupného na https://github.com/orchestral/ tenanti#multi-database-connection-setup a přidejte následující kód.

<?php namespace App\Providers;

use Orchestra\Support\Facades\Tenanti;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Tenanti::setupMultiDatabase('tenants', function (User $entity, array $template) {
            $template['database'] = "tenant_{$entity->getKey()}";

            return $template;
        });
    }
}

To by zajistilo, že používáte tenant_1 databáze pro uživatele=1, tenant_2 databáze pro uživatele=2 a tak dále.

Jak tedy Tenanti zjistí, který uživatel je aktivní?

Zde musíte do svého middlewaru přidat logiku.

$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();

Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');


  1. JOIN a GROUP_CONCAT se třemi stoly

  2. Zajímavosti o spouštěčích MÍSTO

  3. SQL Server Změna modelu obnovy

  4. Rámec jednotkových testů pro databáze