首页 > 解决方案 > 在运行时指定 Laravel Eloquent 数据库的问题

问题描述

拉拉维尔 5.8。我正在尝试保存 Eloquent 模型,在运行时选择数据库连接:

$catModel = new Cat;
if (env('USE_STAGING')) {
    $catModel->setConnection('staging');
}
$cat = $catModel::create(['name' => $request->name]);

我的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,
    ],
    'staging' => [
        'driver' => 'mysql',
        'host' => env('STAGING_DB_HOST', '127.0.0.1'),
        'port' => env('STAGING_DB_PORT', '3306'),
        'database' => env('STAGING_DB_DATABASE', 'forge'),
        'username' => env('STAGING_DB_USERNAME', 'forge'),
        'password' => env('STAGING_DB_PASSWORD', ''),
        'unix_socket' => env('STAGING_DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
],

我的问题是,每次我运行此代码时,cat都会在mysql(默认)数据库中创建,而不是在staging数据库中创建,即使USE_STAGINGtrue.

标签: phpmysqldatabaselaraveleloquent

解决方案


问题是create()方法的静态调用。

通过更改$catModel::create()$catModel->create()应该使用正确的连接:

$catModel = new Cat;

if (env('USE_STAGING')) {
    $catModel->setConnection('staging');
}

$cat = $catModel->create(['name' => $request->name]);

推荐阅读