sql >> Database >  >> RDS >> Mysql

Hoe orkestrale/tenanti gebruiken in Laravel 5 om een ​​toepassing met meerdere huurders te bouwen met meerdere databases?

+1 voor @morphatic antwoord, het is vrij nauwkeurig voor de meeste dingen.

Migratie

Voor uw hoofddatabase zou u de standaard database/migration moeten kunnen gebruiken en gebruik php artisan make:migration en php artisan migrate .

Tenanti zal echter het migratiepad gebruiken dat is ingesteld onder de "stuurprogramma"-configuratie. bijvoorbeeld:

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

In dit geval wordt de migratie gemaakt/gemigreerd vanuit database/tenanti/user (u kunt een andere map kiezen en deze zal die map gebruiken). Zodra je dit hebt ingesteld, kun je een nieuw migratiebestand voor de gebruiker-tenant maken via php artisan tenanti:make user create_blogs_table (als voorbeeld) en voer de migratie uit via php artisan tenanti:migrate user (zie de overeenkomst tussen het Laravel-migratiecommando en Tenanti?).

Bestuurder

Stuurprogramma is slechts het groeperen van een huurder, u kunt het misschien groeperen op gebruikers, bedrijven of team enz. En het is mogelijk dat u meer dan één type groep per project nodig heeft, anders gebruikt u meestal slechts één " groep" of "chauffeur".

Verificatie of toegang tot DB

Allereerst moet u overwegen hoe u van plan bent om elke huurder te onderscheiden. Meestal zie ik dat mensen de neiging hebben om voor een subdomein te kiezen. In dit geval moet u dus controleren of het subdomein tot een van de gebruikers behoort (door de hoofddatabase te doorzoeken) met behulp van een middleware en vervolgens verbinding maken met de database die bij de gebruiker hoort.

Tenanti beheert dat deel van het proces niet, omdat iedereen op dat aspect een andere stijl heeft, maar we bieden wel een code om dynamisch verbinding te maken met uw databasetenant vanuit een basisdatabaseconfiguratie.

Stel dat u de volgende configuratie heeft:

<?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' => [ ... ],
];

U kunt de stap volgen die beschikbaar is in https://github.com/orchestral/ tenanti#multi-database-connection-setup en voeg de volgende code toe.

<?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;
        });
    }
}

Dit zou ervoor zorgen dat u tenant_1 . gebruikt database voor gebruiker=1, tenant_2 database voor user=2 enzovoort.

Dus hoe detecteert Tenanti welke gebruiker actief is?

Dit is waar je logica in je middleware moet toevoegen.

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

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


  1. Bash-script om waarden in MySQL in te voegen

  2. Intel Optane Storage voor SQL Server gebruiken

  3. Hoe het langzame query-logboek in MySQL in te schakelen?

  4. Hoe een Oracle-opgeslagen procedure uit te voeren via een databasekoppeling