我需要在运行时更改 laravel 5 数据库连接。
你对此有什么想法吗?
请与我分享。
谢谢。
您可以在运行时使用
更改连接详细信息Config::set('database.connections.mysql.database', 'other_database');
但不要忘记之前运行
purge
以删除缓存
DB::purge('mysql');
更新:这个答案是2015年的!我已经很多年没有使用 Laravel 了,也没有掌握最新的最佳实践。这个答案不断得到支持,所以我认为它有效,但请谨慎行事。
好吧,我对此的直接回答是:不。您很可能可以通过更改数据模型并使用一些更高级的关系来完成任务。在不知道你想做什么的情况下很难说,但在我看来,总的来说这是一个坏主意,特别是如果你打算使用雄辩的模型等
也就是说,在某些情况下,您确实需要更改另一个数据库中的数据或执行一些原始查询,您可以使用
DB::connection()
方法。比如:
$data = DB::connection('another_connection')->select(...);
您可以在
another_connection
文件中指定 database.php
变量。像这样:
<?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';
为每个雄辩模型指定一个连接,您也可以为运行时创建/查询的每个模型实例指定一个连接
$user = new User;
$user->setConnection('another_connection');
$user1 = $user->find(1);
但话又说回来,我个人认为这不是一个好主意,在我看来,随着应用程序复杂性的增加,一切都会变得混乱并很快崩溃。
从 Laravel 5.x 或 6.x 开始你可以这样改变它
config(['database.default' => 'databasename']);
其中
databasename
必须在 config/database
数组中的 connections
中指定。
我们有一个类似的场景,要查找历史数据,我们更改数据库。我们在模型中使用以下内容:
public function inventory($db, $id) {
return DB::table($db . '.inventory')->where('inventoryid', $id)->get();
}
然后,在代码中,我们将 $db 作为参数发送:
$inventory = Inventory::inventory('data_2016', 2);
这样,您不需要为每个不同的数据库定义连接,也不需要修改数据库配置文件。
唯一的缺点是你无法直接使用模型,而必须使用 DB helper。
您可以在运行时配置另一个连接(在 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();