【问题标题】:Laravel Project Multi-tenant, Multi-database and one domainLaravel 项目多租户、多数据库和一个域
【发布时间】:2021-11-17 00:43:35
【问题描述】:

您好,请您帮我将项目 laravel 多租户与多数据库:

我想创建用户数据库,例如在我的系统中有两个用户 A 和 B。我有一个主数据库和两个数据库 user_a(用于用户 A)和 user_b(用于用户 B)。在主数据库中,我拥有所有用户信息。现在我想要的是,当用户 A 登录系统时,它访问 user_a 数据库,当用户 B 登录数据库时,连接应该是 user_b 数据库。

【问题讨论】:

    标签: laravel laravel-8 breeze multi-tenant multi-database-connections


    【解决方案1】:
    1. 首先,在.env
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=master_db
    DB_USERNAME=root
    DB_PASSWORD=
    
    DB_CONNECTION_A=mysql
    DB_HOST_A=127.0.0.1
    DB_PORT_A=3306
    DB_DATABASE_A=a_db
    DB_USERNAME_A=root
    DB_PASSWORD_A=
    
    DB_CONNECTION_B=mysql
    DB_HOST_B=127.0.0.1
    DB_PORT_B=3306
    DB_DATABASE_B=b_db
    DB_USERNAME_B=root
    DB_PASSWORD_B=
    
    1. config/database.php:
    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    
    'mysql_a' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST_A', '127.0.0.1'),
        'port' => env('DB_PORT_A', '3306'),
        'database' => env('DB_DATABASE_A', 'forge'),
        'username' => env('DB_USERNAME_A', 'forge'),
        'password' => env('DB_PASSWORD_A', ''),
        'unix_socket' => env('DB_SOCKET_A', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    
    'mysql_b' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST_B', '127.0.0.1'),
        'port' => env('DB_PORT_B', '3306'),
        'database' => env('DB_DATABASE_B', 'forge'),
        'username' => env('DB_USERNAME_B', 'forge'),
        'password' => env('DB_PASSWORD_B', ''),
        'unix_socket' => env('DB_SOCKET_B', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    
    1. 如果 users 表存在于主数据库中,并且数据库 A 和 B 中都存在 books 表(例如),则在迁移文件中:
    Schema::connection('mysql')->create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('database');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
    
    Schema::connection('mysql_a')->create('books', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
    Schema::connection('mysql_b')->create('books', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
    1. 现在您有三个数据库连接,当您想更改ModelDB 上的连接时,您可以执行以下操作: 对于模型:
    $books = Book::on('mysql_a')->find(1);
    

    对于数据库查询:

    DB::connection('mysql_b')->table('books')->get();
    
    1. 根据用户数据库类型选择书籍的示例:
    $user = auth()->user();
    
    switch ($user->database) {
        case 'A':
            return Book::on('mysql_a')->all();
            break;
            
        case 'B':
            return Book::on('mysql_b')->all();
            break;
    }
    

    注意:更改.env文件或config/database.php时不要忘记运行php artisan config:cache

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 2019-04-14
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2014-07-15
      相关资源
      最近更新 更多