sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo usar orquestal/tenanti en Laravel 5 para crear una aplicación de múltiples inquilinos con múltiples bases de datos?

+1 a la respuesta de @morphatic, es bastante precisa en la mayoría de las cosas.

Migración

Para su base de datos principal, debería poder usar la database/migration predeterminada y utilice php artisan make:migration y php artisan migrate .

Sin embargo, Tenanti utilizará la ruta de migración establecida en la configuración del "controlador". por ejemplo:

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

En este caso, la migración se creará/migrará desde database/tenanti/user (puede elegir otra carpeta y usará esa carpeta). Una vez que configure esto, puede crear un nuevo archivo de migración para el arrendatario del usuario a través de php artisan tenanti:make user create_blogs_table (como ejemplo) y ejecute la migración a través de php artisan tenanti:migrate user (¿Ves la similitud entre el comando de migración de Laravel y Tenanti?).

Conductor

El controlador es solo la agrupación de un arrendatario, tal vez lo agrupe por usuarios, empresas o equipo, etc. Y existe la posibilidad de que necesite más de un tipo de grupo por proyecto; de lo contrario, la mayoría de las veces solo usará un solo " grupo" o "conductor".

Autenticación o acceso a la base de datos

En primer lugar, debe considerar cómo planea distinguir a cada inquilino. La mayoría de las veces vería que la gente tiende a optar por el subdominio. Entonces, en este caso, debe verificar si el subdominio pertenece a alguno de los usuarios (al consultar la base de datos principal) utilizando un middleware y luego conectarse a la base de datos que pertenece al usuario.

Tenanti no administra esa parte del proceso, porque todos tienen un estilo diferente en ese aspecto, pero proporcionamos un código para conectarse dinámicamente a su inquilino de base de datos desde una configuración de base de datos.

Digamos que tiene la siguiente configuración:

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

Puede seguir el paso disponible en https://github.com/orchestral/ tenti#configuración-de-conexión-de-base-de-datos-múltiples y agrega el siguiente código.

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

Esto aseguraría que esté usando tenant_1 base de datos para usuario=1, tenant_2 base de datos para usuario=2 y así sucesivamente.

Entonces, ¿cómo detecta Tenanti qué usuario está activo?

Aquí es donde necesita agregar lógica en su middleware.

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

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