我需要在运行时更改laravel 5数据库连接。
你对此有什么想法吗?
请与我分享。
感谢。
答案 0 :(得分:12)
更新:这个答案是从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);
但话说回来,我个人认为这不是一个好主意,而且在我看来,随着应用程序的复杂性增加,一切都会变得混乱而且迅速崩溃。
答案 1 :(得分:12)
您可以使用
在运行时更改连接详细信息Config::set('database.connections.mysql.database', 'other_database');
但不要忘记在删除缓存之前清除
DB::purge('mysql');
答案 2 :(得分:1)
从Laravel 5.x或6.x开始,您可以像这样更改它
config(['database.default' => 'databasename']);
必须在databasename
数组的config/database
中指定connections
的地方。
答案 3 :(得分:0)
我们有一个类似的场景,在哪里寻找历史数据,我们改变了数据库。我们在模型中使用以下内容:
def permutationEquation(p):
result = []
for i in range(1, len(p)+1):
for y, v in enumerate(p):
if p[v-1] != i:
break
result.append(y + 1)
然后,在代码上,我们将$ db作为参数发送:
public function inventory($db, $id) {
return DB::table($db . '.inventory')->where('inventoryid', $id)->get();
}
这样,您不需要为每个不同的数据库定义连接,也不需要修改数据库配置文件。
唯一的缺点是您无法直接使用该模型,而是必须使用数据库帮助程序。