Php Laravel:未定义索引:驱动程序
我正在使用Laravel 5.5,需要动态更改数据库,Php Laravel:未定义索引:驱动程序,php,mysql,laravel,Php,Mysql,Laravel,我正在使用Laravel 5.5,需要动态更改数据库, 例如,有两个数据库,db1和db2,每个数据库中都有一个表articles 现在我想将文章从db1复制到db2 在.env文件中,当前数据库是db1: DB_DATABASE=db1 我想在复制记录时动态更改它,我尝试这样做: public function test() { $articles=Article::all(); Config::set("database.connections.mysql", [
例如,有两个数据库,
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" => ""
]
]);
错误仍然存在
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', ''),
],
错误是因为配置中缺少
驱动程序
更改连接的更好方法是在数据库配置文件中注册新连接,并在运行时更改连接
'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);
或者,如果您使用的是雄辩的模型,则可以使用connection
属性设置与模型关联的默认连接
protected $connection = 'newConnection';
或者在运行时通过调用setConnection
(new User)->setConnection('newConnection');
如果要更改当前连接详细信息,可以根据需要进行更改
Config::set('database.connections.mysql.database', 'db2');
更改后,您需要致电
DB::reconnect('mysql');
或
在我的例子中,驱动程序和其他所有东西都配置好了,但当我碰到任何端点时,它抛出了那个错误。我无法使用php artisan命令删除缓存,所以对我来说,解决方案是从app/bootstrap/cache文件夹中手动删除缓存文件,因为旧配置仍然存在,并且无法识别新的数据库连接 您是否检查了config/database.php中的env('DB_CONNECTION','mysql')
?Sagar Gautam它有这个项。一种方法是使用DB::CONNECTION()创建到数据库的新连接。@Sagar Gautam但这种方法需要将数据库名称写入config/database.php,我有很多DataTase。然后在那里写整个连接将是一个问题,我不明白。defalut配置文件有'driver'=>'mysql'
,请参阅我的更新。兄弟,你是自己放的,因此需要传递数组键值对。我有很多数据库。假设我有200个数据库,因此,我将添加200项。我不想这样做。你不想要什么呢??您只是将驱动程序索引添加到您的代码中,请参见ans的上半部分,我只是将驱动程序值添加到您的代码中,而没有添加任何内容else@Exprator我懂了。我误解了。Config::set('database.connections.mysql.database','db2')代码>它可以工作。
DB::purge('mysql');