Laravel运行时更改数据库连接

28

我需要在运行时更改 Laravel 5 的数据库连接。

你有任何想法吗?

请与我分享。

谢谢。


这个链接会有所帮助:http://fideloper.com/laravel-multiple-database-connections - imsheth
5个回答

35

您可以在运行时使用

更改连接详细信息

Config::set('database.connections.mysql.database', 'other_database');

但不要忘记在运行purge之前清除缓存

DB::purge('mysql');

3
我浪费了10个小时试图在运行时更改默认数据库。我忘记的是DB::purge()方法。谢谢! - Renan Coelho
2
非常感谢您的帮助。DB::purge('mysql') 是关键! - Adam Kozlowski
1
如果另一个数据库使用另一个密码,您需要使用以下代码:Config::set('database.connections.mysql', Config::get('database.connections.other_database')); 其中"other_database"是指向凭据数组的自己的键。 - I Want Answers

25

更新:这篇答案是来自2015年的!我已经好几年没用Laravel了,也不了解最新的最佳实践。这个答案一直被点赞,所以我想它应该还管用,但请谨慎使用。


我的即时答复是:不要这样做。很可能你可以通过更改数据模型并使用一些更高级的关系来完成你的任务。不知道你想要做什么,但总的来说,这似乎是一个不好的主意,特别是如果你计划使用Eloquent模型等等

话虽如此,在某些情况下,如果您真的需要更改另一个数据库中的数据或执行一些原始查询,您可以使用DB::connection()方法。像这样:

$data = DB::connection('another_connection')->select(...);

你可以在你的database.php文件中设置another_connection变量。像这样:
<?php
return array(

'default' => 'mysql',

'connections' => array(

    # Your regular connection
    'mysql' => array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'database',
        'username'  => 'user',
        'password'  => 'password'
        'charset'   => 'utf8',

    ),

    # Your new connection
    'another_connection' => array(
        'driver'    => 'mysql',
        'host'      => 'another_host',
        'database'  => 'another_db',
        'username'  => 'user1',
        'password'  => 'password1'
        'charset'   => 'utf8',
    ),
),
);

您甚至可以使用protected $connection = 'another_connection';为每个Eloquent模型指定连接,同时您还可以在运行时为每个模型实例创建/查询指定连接。

$user = new User;
$user->setConnection('another_connection');
$user1 = $user->find(1);

但是,我个人认为这不是一个好主意,随着您的应用程序变得越来越复杂,一切都可能会变得混乱并迅速崩溃。


1
谢谢你的回答,我尝试更改模型方法中的“connection”属性,但是使用DB门面上的“connection”方法解决了问题。为了说明一个有效的用例:我正在创建一个小系统,检查所有数据是否正确映射。当我在报告端经历用户和自己的自由文本输入机会时,这个要求出现了。所有应用程序数据都存储在MySQL数据库中,但我需要查询SQL服务器,以验证是否在生产端上运行我的-mysql-保存的查询是否遇到问题。 - Ben Fransen
就我个人而言,我反对切换连接。而且我不理解在存储数据后验证数据的想法,数据应该在存储之前进行验证。 - Mina Abadir
1
谢谢,仅供参考,不仅 DB,而且 Schema 也有一个连接函数,它的工作方式如下:Schema::connection('pgsql_admin')->create( - Yevgeniy Afanasyev
实际上,如果您正在使用多个数据库并且进行了良好的单元/功能测试,动态更改连接是一个非常好的主意。 - Alex

6
自 Laravel 5.x 或 6.x 开始,您可以像这样更改它。
config(['database.default' => 'databasename']);

config/database文件的connections数组中必须指定databasename


这是正确的方法。需要定义数据库连接。似乎仅仅更改'mysql'连接的数据库名称并不总是有效。 - shrimpwagon

1
我们有一个类似的情况,需要查找历史数据时,我们会更改数据库。在模型中,我们使用以下代码:
public function inventory($db, $id) {
  return DB::table($db . '.inventory')->where('inventoryid', $id)->get();
}

然后,在代码中,我们将 $db 作为参数发送:

$inventory = Inventory::inventory('data_2016', 2);

这样,您就不需要为每个不同的数据库定义连接,也不需要调整数据库配置文件。唯一的缺点是您无法直接使用模型,而必须使用DB助手。

1
您可以在运行时配置另一个连接(已在Laravel 9上测试通过)
$runtimeConnectionConfig = array_merge(config('database.connections.mysql'), [
    'host' => 'db_host',
    'database' => 'db_name',
    'user' => 'db_user',
    'password' => 'db_pass',
]);

config(['database.connections.NEW_CONNECTION_NAME' => $runtimeConnectionConfig]);

$runtimeConnection = DB::connection('NEW_CONNECTION_NAME');

$data = $runtimeConnection->table('users')->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接