当前位置: 首页 > 知识库问答 >
问题:

在laravel中动态连接多个数据库[重复]

朱通
2023-03-14

我正在构建一个需要连接2个数据库的应用程序。第一个是静态的,另一个是动态的。config/database.php类似于

'mysql' => 
array (
  'driver' => 'mysql',
  'host' => '127.0.0.1',
  'port' => '3306',
  'database' => 'blog',
  'username' => 'root',
  'password' => '',
  'unix_socket' => '',
  'charset' => 'utf8mb4',
  'collation' => 'utf8mb4_unicode_ci',
  'prefix' => '',
  'strict' => true,
  'engine' => NULL,
),
'business2' => 
array (
  'driver' => 'mysql',
  'host' => '127.0.0.1',
  'port' => '3306',
  'database' => 'blog2',
  'username' => 'root',
  'password' => '',
  'unix_socket' => '',
  'charset' => 'utf8mb4',
  'collation' => 'utf8mb4_unicode_ci',
  'prefix' => '',
  'strict' => true,
  'engine' => NULL,
),

模型代码就像

Class  TableNewData extends Model
{
    protected $connection = 'business3';
    protected $table = 'table2_data';
    public function getData()
    {
        return $this->get()->toArray();
    }
}

如果我提供静态连接详细信息,我可以连接多个数据库,但如果我提供动态连接详细信息,如

 $connection = Session::get()->connection;  

$connection=$_SESSION('connection');

动态连接多个数据库而不影响应用程序性能的最佳方法是什么?

共有2个答案

邵凯定
2023-03-14

在运行时更改连接的一种方法是通过配置设置值:

config(['database.connections.mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'my_database'),
    'username'  => env('DB_USERNAME', 'my_user'),
    'password'  => env('DB_PASSWORD', 'my_password'),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
]]);

例如,这可以应用在中间件中,以便在租户数据库之间动态切换。

您还可以通过DB facade指定连接:

DB::connection('mysql_2')->select(...);
罗伟兆
2023-03-14

我和你有同样的问题。这个博客绝对可以帮你。

Laravel多租户多数据库最终指南

下面是config/database.php文件根据您的情况显示的样子。因为第二个是动态的,所以不需要定义数据库。

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'blog'),
        'username' => env('DB_USERNAME', 'root'),
        'password' => env('DB_PASSWORD', 'password'),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => 'InnoDB',
    ],
'business' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => '',
        'username' => env('DB_USERNAME', 'root'),
        'password' => env('DB_PASSWORD', 'password'),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => 'InnoDB',
    ], 

基本上,设置一个数据库助手函数,在运行时连接到数据库,然后在正确的中间件中调用它

function connect($hostname, $username, $password, $database)
{
    // Erase the tenant connection, thus making Laravel get the default values all over again.
    DB::purge('business');
    // Make sure to use the database name we want to establish a connection.
    Config::set('database.connections.tenant.host', $hostname);
    Config::set('database.connections.tenant.database', $database);
    Config::set('database.connections.tenant.username', $username);
    Config::set('database.connections.tenant.password', $password);
    // Rearrange the connection data
    DB::reconnect('business');
    // Ping the database. This will throw an exception in case the database does not exists.
    Schema::connection('tenant')->getConnection()->reconnect();
}

不要忘记告诉作曲家,通过将这些行添加到composer.json文件中,可以全局使用helper函数。

"autoload": {
    "classmap": [
        "database"
    ],
    "files":[
        "database/utilities/helpers.php"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

您还希望有静态和动态模型,这些模型应该扩展以定义要使用的数据库连接。

class StaticModel extends Model
{
    protected $connection = 'mysql';
}
class DynamicModel extends Model
{
    protected $connection = 'business';
}

在中间件中,根据数据库名称建立动态数据库连接。

connect(getenv('DB_HOST'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'), getenv('DB_SYMBOL') . $databasename);

因此,您可以正常使用该模型,但它具有动态数据库连接

 类似资料:
  • 问题内容: 我正在Laravel 5(.1)中创建一个应用程序,在该应用程序中需要连接到不同的数据库。唯一的问题是,它不知道必须连接到哪个数据库,因此无法在config中使用database.php。控制器负责使用动态给定的连接详细信息进行连接。 如何建立与数据库的新连接,包括使用DB类?(或者这可能) 提前致谢! 问题答案: 最简单的解决方案是在运行时设置数据库配置。Laravel可能希望从文件

  • 我正在创建一个多租户应用程序,在该应用程序中,我基于子域连接到该特定租户的数据库。 下面是执行此操作的代码: 这是连接数据库的最佳方式,还是存在任何问题,因为我是从性能的角度考虑的,因为每次连接数据库时都有不同的子域。最好的方法是什么?

  • 所以我有数百个数据库,我想根据我传递的值来改变使用什么数据库 例如,我有许多公司分支机构有branch_code(000,001,002,003等。高达200)。它们都有相同的表,但只是在不同的数据库中创建的。还假设只有DB Name不同。我的问题是,当有数百个数据库时,我如何访问不同的数据库?我应该动态更改. env文件吗?当用户选择另一个分支时,我应该创建一个改变连接的函数吗?如果是的话,怎么

  • 当用户是管理员角色时,如何更改数据库连接?管理数据库包含其他用户不能访问的信息,并且要求数据库必须位于自己的服务器上。我目前有单独的管理员连接配置。 我想,没有硬编码是在应用中,所以如何可以拉威尔做开关时,必要的?谢谢你的帮助。

  • 从bugu-mongo 2.11版本开始,支持连接到多个数据库。 在前面的示例代码中,我们都只是连接到一个数据库: //默认的数据库连接 BuguConnection conn = BuguFramework.getInstance().createConnection(); conn.setHost("192.168.0.100"); conn.setPort(27017); conn.setU

  • 我正在开发一个具有多个数据库访问的应用程序,我想用它进行PHPUnit测试。我目前的方法是在中拥有多个连接(mysql,mysql2,mysql3),这样我就可以在env文件中对所有这些连接进行不同的访问。因此,模型定义了变量。在我的第一个功能测试中,我想访问一个页面,只看到我在工厂提供的数据,所以只是为了让事情开始。在我的文件中,我已经将指定为,并且对于每个MySql设置都具有。 稍后编辑 所以