【问题标题】:Programmatically edit config/database.php connection以编程方式编辑 config/database.php 连接
【发布时间】:2021-09-05 17:59:18
【问题描述】:

我有一个 SAAS 应用程序,用户可以在其中创建学校,现在,一旦该学校获得批准,我需要自动创建该学校的数据库。到目前为止,我可以手动通过向 database.php 配置添加新连接来完成此操作。我的问题是,如何动态添加新连接到 database.php?

     ...

     'connections' => [

        'tenant2' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => 'tenant2',
            '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'),
            ]) : [],
        ],

        'paco97058' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => 'paco97058',
            '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'),
            ]) : [],
        ],
      ]

我想将paco97058动态添加到database.php

请注意,paco97058 是数据库名称,在创建时会自动创建。

【问题讨论】:

  • 带连接数据库的数据库??
  • 是的,就是这样。
  • 每个学校真的需要不同的数据库吗?
  • 我明白了。但问题是您是否真的需要多个数据库?它是一个 SaaS 应用程序这一事实有点无关紧要。
  • 这能回答你的问题吗? stackoverflow.com/questions/67602130/…

标签: php database laravel connection config


【解决方案1】:

使用下面的方法解决了,谢谢@shaedrich。

<?php

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

$connections = [];
$tenants = DB::connection('landlord')->table('tenants')->where('status', 'Approved')->get();

foreach ($tenants as $tenant) {
    $connections[$tenant->database] = [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => $tenant->database,
        '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'),
        ]) : [],
    ];
}

return [

    'default' => env('DB_CONNECTION'),

    'connections' => [

        'tenant' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => null,
            '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'),
            ]) : [],
        ],

        'landlord' => [
            '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'),
            ]) : [],
        ],

        $connections,

    ],

我先获取了 $tenant-> 数据库,然后使用 foreach 循环来存储与数组的连接。

【讨论】:

  • 这看起来是解决这个问题的可靠方法。我建议只注册您在该请求中使用的租户的连接,而不是为所有租户注册连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2020-10-16
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2012-07-22
相关资源
最近更新 更多