sql >> データベース >  >> RDS >> Mysql

Laravel 5でオーケストラ/テナントを使用して、複数のデータベースでマルチテナントアプリケーションを構築するにはどうすればよいですか?

    @morphaticの答えに+1、それはほとんどのもので静かに正確です。

    移行

    メインデータベースには、デフォルトのdatabase/migrationを使用できるはずです。 php artisan make:migrationを利用します およびphp artisan migrate

    ただし、Tenantiは、「ドライバー」構成で設定された移行パスを使用します。例:

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

    この場合、移行はdatabase/tenanti/userから作成/移行されます。 (他のフォルダーを選択すると、そのフォルダーが使用されます)。これを設定すると、php artisan tenanti:make user create_blogs_tableを介してユーザーテナントの新しい移行ファイルを作成できます。 (例として)php artisan tenanti:migrate userを介して移行を実行します (Laravel移行コマンドとTenantiの類似点を参照してください?)

    ドライバー

    ドライバーは単なるテナントのグループ化であり、ユーザー、企業、チームなどでグループ化する場合があります。また、プロジェクトごとに複数のタイプのグループが必要になる可能性があります。それ以外の場合は、ほとんどの場合、単一の「グループ」または「ドライバー」。

    認証またはDBへのアクセス

    まず、各テナントをどのように区別するかを検討する必要があります。ほとんどの場合、人々はサブドメインを選ぶ傾向があります。したがって、この場合、ミドルウェアを使用してサブドメインがいずれかのユーザーに属しているかどうかを確認してから(メインデータベースにクエリを実行して)、ユーザーに属するデータベースに接続する必要があります。

    Tenantiはプロセスのその部分を管理しません。これは、その側面でスタイルが異なるためですが、基本データベース構成からデータベーステナントに動的に接続するためのコードを提供しています。

    次の設定があるとします:

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

    https://github.com/orchestral/で利用可能な手順に従うことができますTenanti#multi-database-connection-setup 次のコードを追加します。

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

    これにより、tenant_1を使用していることが保証されます user =1のデータベース、tenant_2 user=2などのデータベース。

    では、Tenantiはアクティブな場合にどのユーザーをどのように検出するのでしょうか。

    ここで、ミドルウェアにロジックを追加する必要があります。

    $user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();
    
    Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');
    


    1. MySQL DATEDIFF()とTIMEDIFF():違いは何ですか?

    2. Laravelを使用してデータベース駆動型のマルチレベルナビゲーションメニューを作成する方法

    3. mysqlの大きなテーブルからランダムな行をすばやく選択

    4. null値を外部キーフィールドに渡す方法は?