+1 alla risposta @morphatic, è abbastanza preciso sulla maggior parte delle cose.
Migrazione
Per il tuo database principale dovresti essere in grado di utilizzare il database/migration
predefinito e utilizza php artisan make:migration
e php artisan migrate
.
Tenanti utilizzerà invece il percorso di migrazione impostato nella configurazione "driver". es:
'path' => database_path('tenanti/user'),
In questo caso la migrazione verrà creata/migrata da database/tenanti/user
(puoi scegliere un'altra cartella e utilizzerà quella cartella). Una volta impostato questo, puoi creare un nuovo file di migrazione per l'utente tenant tramite php artisan tenanti:make user create_blogs_table
(ad esempio) ed eseguire la migrazione tramite php artisan tenanti:migrate user
(vedi la somiglianza tra il comando di migrazione Laravel e Tenanti?).
Autista
Il driver è solo il raggruppamento di un inquilino, forse lo stai raggruppando per utenti, aziende o team, ecc. E c'è la possibilità che tu possa richiedere più di un tipo di gruppo per progetto, altrimenti la maggior parte delle volte utilizzerai solo un singolo " gruppo" o "driver".
Autenticazione o accesso al DB
Prima di tutto, devi considerare come intendi distinguere ogni inquilino. La maggior parte delle volte vedrei che le persone tendono a optare per il sottodominio. Quindi in questo caso è necessario verificare se il sottodominio appartiene a qualcuno degli utenti (interrogando il database principale) utilizzando un middleware e quindi connettersi al database che appartiene all'utente.
Tenanti non gestisce quella parte del processo, perché ognuno ha uno stile diverso su questo aspetto, ma forniamo un codice per connettersi dinamicamente al tenant del database da una configurazione del database di base.
Supponiamo che tu abbia la seguente configurazione:
<?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' => [ ... ],
];
Puoi seguire il passaggio disponibile in https://github.com/orchestral/ tenanti#multi-database-connection-setup e aggiungi il seguente codice.
<?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;
});
}
}
Ciò ti assicurerebbe di utilizzare tenant_1
database per utente=1, tenant_2
database per utente=2 e così via.
Qui è dove devi aggiungere la logica nel tuo middleware.
$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();
Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');