sql >> Databasteknik >  >> RDS >> Mysql

Hur använder man orchestral/tenanti i Laravel 5 för att bygga en multi tenant-applikation med flera databaser?

+1 till @morfatiskt svar, det är tyst noggrant på det mesta.

Migrering

För din huvuddatabas bör du kunna använda standard database/migration och använd php artisan make:migration och php artisan migrate .

Tenanti kommer dock att använda migreringsvägen som ställts in under "drivrutin"-konfigurationen. t.ex.:

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

I det här fallet kommer migreringen att skapas/migreras från database/tenanti/user (du kan välja en annan mapp och den kommer att använda den mappen). När du har ställt in detta kan du skapa en ny migreringsfil för användarens klient via php artisan tenanti:make user create_blogs_table (som ett exempel) och kör migrering via php artisan tenanti:migrate user (ser du likheten mellan Laravels migrationskommando och Tenanti?).

Drivrutin

Drivrutinen är bara grupperingen av en hyresgäst, du kanske grupperar den efter användare, företag eller team etc. Och det finns möjlighet att du kan behöva mer än en typ av grupp per projekt, annars använder du oftast bara enstaka " grupp" eller "förare".

Autentisering eller åtkomst till DB

Först och främst måste du överväga hur du planerar att särskilja varje hyresgäst. För det mesta skulle jag se att folk tenderar att välja underdomän. Så i det här fallet måste du kontrollera om underdomänen tillhör någon av användarna (genom att fråga i huvuddatabasen) med hjälp av ett mellanprogram och sedan ansluta till databasen som tillhör användaren.

Tenanti hanterar inte den delen av processen, eftersom alla har olika stil på den aspekten, men vi tillhandahåller en kod för att dynamiskt ansluta till din databashyresgäst från en basdatabaskonfiguration.

Låt säga att du har följande konfiguration:

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

Du kan följa steget som är tillgängligt i https://github.com/orchestral/ tenanti#multi-database-connection-setup och lägg till följande kod.

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

Detta skulle säkerställa att du använder tenant_1 databas för user=1, tenant_2 databas för user=2 och så vidare.

Så hur upptäcker Tenanti vilken användare om den är aktiv?

Det är här du behöver lägga till logik i din mellanprogramvara.

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

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


  1. MySQL - Kan inte lägga till eller uppdatera en underordnad rad:en begränsning av främmande nyckel misslyckas

  2. Alla värden ='s' i tabellen i PHP-fel

  3. funktion returnerar flera kolumner som en enda kolumn istället för flera kolumner

  4. Hur rundar man av en DateTime i MySQL?