Laravel:未定义索引:驱动程序

zwl*_*619 1 php mysql laravel

我使用的是 Laravel 5.5,我需要动态更改数据库,
例如,有两个数据库,db1每个数据库中db2有一个表articles

现在我想将文章从 复制db1db2

.env文件中,当前数据库是db1

DB_DATABASE=db1
Run Code Online (Sandbox Code Playgroud)

我想在复制记录时动态更改它,我尝试这样做:

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');
}
Run Code Online (Sandbox Code Playgroud)

但有一个错误:

未定义索引:驱动程序

我有很多数据库,所以我不想在.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,
    ],

],
Run Code Online (Sandbox Code Playgroud)

我尝试

    Config::set("database.connections.mysql", [
       'mysql' => [
           "host" => "127.0.0.1",
           "database" => "db2",
           "username" => "root",
           "password" => ""
        ]
    ]);
Run Code Online (Sandbox Code Playgroud)

错误仍然存​​在。

cha*_*fdo 6

该错误是因为您的配置中缺少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,
    ],
]
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用用于定义新连接的名称来更改连接。

更改默认连接

Config::set('database.default', 'newConnection');
DB::reconnect('newConnection');
Run Code Online (Sandbox Code Playgroud)

或更改查询生成器的连接

DB::connection('newConnection')->table('articles')->insert($articles);
Run Code Online (Sandbox Code Playgroud)

connection或者,如果您使用 Eloquent 模型,您可以使用属性设置与模型关联的默认连接

protected $connection = 'newConnection';
Run Code Online (Sandbox Code Playgroud)

或通过调用在运行时更改setConnection

(new User)->setConnection('newConnection');
Run Code Online (Sandbox Code Playgroud)

如果您想更改当前的连接详细信息,您可以根据需要进行更改

Config::set('database.connections.mysql.database', 'db2');
Run Code Online (Sandbox Code Playgroud)

更改后您需要致电

DB::reconnect('mysql');
Run Code Online (Sandbox Code Playgroud)

或者

DB::purge('mysql');
Run Code Online (Sandbox Code Playgroud)