我正在使用Laravel 5.5,我需要动态更改数据库,
例如,有两个数据库db1
和db2
,每个数据库中都有一个表articles
。
现在我想将文章从db1
复制到db2
,
在.env
文件中,当前数据库为db1
:
DB_DATABASE=db1
我想在复制记录时动态更改它,我试着这样做:
public function test()
{
$articles=Article::all();
Config::set("database.connections.mysql", [
"host" => "127.0.0.1",
"database" => "db2",
"username" => "root",
"password" => ""
]);
//DB::purge('mysql'); //this line exists or not,it has the same error.
DB::table('articles')->insert($articles);
dd('ok');
}
但是有一个错误:
未定义的索引:驱动程序
我有很多数据库,所以我不想在.env
文件中更改它
我该怎么办?
更新:
config/database.php
中的有两个项目:
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
],
我试试
Config::set("database.connections.mysql", [
'mysql' => [
"host" => "127.0.0.1",
"database" => "db2",
"username" => "root",
"password" => ""
]
]);
错误仍然存在。
答案 0 :(得分:2)
错误是因为您错过了配置中的driver
。
更改连接的更好方法是在数据库配置文件中注册新连接并在运行时更改连接。
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'newConnection' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => 'db2',
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
]
现在,您可以使用用于定义新连接的名称更改连接。
更改默认连接
Config::set('database.default', 'newConnection');
DB::reconnect('newConnection');
或更改查询构建器的连接
DB::connection('newConnection')->table('articles')->insert($articles);
或者如果您使用的是Eloquent模型,则可以使用connection
属性设置与模型关联的默认连接
protected $connection = 'newConnection';
或通过调用setConnection
(new User)->setConnection('newConnection');
如果您想更改当前的连接详细信息,可以根据需要进行更改
Config::set('database.connections.mysql.database', 'db2');
更改后需要调用
DB::reconnect('mysql');
或
DB::purge('mysql');
答案 1 :(得分:1)
public function test()
{
$articles=Article::all();
Config::set("database.connections.mysql", [
"driver" => "mysql"
"host" => "127.0.0.1",
"database" => "db2",
"username" => "root",
"password" => ""
]);
//DB::purge('mysql'); //this line exists or not,it has the same error.
DB::table('articles')->insert($articles);
dd('ok');
}
你错过了驱动程序,因为laravel需要你想要使用的数据库驱动程序,因为你使用的是database.connection.mysql,它将设置该数组中的值,但仍然需要驱动程序
as for example
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
],
答案 2 :(得分:0)
在我的情况下,驱动程序以及其他所有配置都已配置,但是当我命中任何端点时都会抛出该错误。我无法使用php artisan命令删除缓存,因此对我来说解决方案是从旧版配置停留在app / bootstrap / cache文件夹中手动删除缓存文件,并且无法识别新的数据库连接。