我需要在运行时更改 Laravel 5 的数据库连接。
你有任何想法吗?
请与我分享。
谢谢。
您可以在运行时使用
更改连接详细信息
。
Config::set('database.connections.mysql.database', 'other_database');
但不要忘记在运行purge
之前清除缓存
DB::purge('mysql');
Config::set('database.connections.mysql', Config::get('database.connections.other_database'));
其中"other_database"是指向凭据数组的自己的键。 - I Want Answers更新:这篇答案是来自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);
但是,我个人认为这不是一个好主意,随着您的应用程序变得越来越复杂,一切都可能会变得混乱并迅速崩溃。
DB
,而且 Schema
也有一个连接函数,它的工作方式如下:Schema::connection('pgsql_admin')->create(
- Yevgeniy Afanasyevconfig(['database.default' => 'databasename']);
在config/database
文件的connections
数组中必须指定databasename
。
public function inventory($db, $id) {
return DB::table($db . '.inventory')->where('inventoryid', $id)->get();
}
然后,在代码中,我们将 $db 作为参数发送:
$inventory = Inventory::inventory('data_2016', 2);
$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();