【问题标题】:Laravel 6 multiple database authentication problemLaravel 6 多数据库认证问题
【发布时间】:2026-01-31 21:20:04
【问题描述】:

我有两个数据库连接如下:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sales_report
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION=sqlsrv
DB_HOST=192.168.102.11
DB_PORT=1433
DB_DATABASE=Some_Name
DB_USERNAME=XXXXXX
DB_PASSWORD=XXXXXX

我正在用mysql进行身份验证,代码如下:

class User extends Authenticatable
{
    use Notifiable;
    protected $connection = 'mysql';

所有数据库连接都正常,但仍然需要很长时间才能登录。它也没有显示任何结果。能否请你帮忙?

【问题讨论】:

  • 有错误信息吗?
  • 您在config/database.php 文件中配置多个连接。如果您像以前一样编写.env 文件,那么您只是用另一组配置覆盖了一组配置。如果要使用多个不同的配置,则需要使用不同的条目名称
  • 不,没有错误信息。它只是显示加载。如果我删除第二个连接,它工作正常。
  • @apokryfos - 因为连接在 mysql 和 MS SQL 之间。所以连接名称在 Laravel 6 中默认是不同的
  • 但是您的 .env 文件中有相互冲突的条目

标签: mysql sql-server laravel


【解决方案1】:

因为你的env db配置key_name是一样的,

好像laravel选择了第二个连接,所以找不到连接mysql。第一个连接被第二个覆盖。

更改.env 的另一个连接密钥名称

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sales_report
DB_USERNAME=root
DB_PASSWORD=

DB_SRV_CONNECTION=sqlsrv
DB_SRV_HOST=Host_name
DB_SRV_PORT=1433
DB_SRV_DATABASE=DB_name
DB_SRV_USERNAME=user
DB_SRV_PASSWORD=password

在您的 config/database.php 中

        'default' => env('DB_CONNECTION', 'mysql'),

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            ...
        ],
        'sql_srv' => [
            'driver' => 'sqlsrv',
            'host' => env('DB_SRV_HOST', '127.0.0.1'),
            'port' => env('DB_SRV_PORT', '3306'),

您可以在您的修补程序中检查连接配置:

config('database.connections.mysql')

如果还是不行,可以清空配置缓存:

php artisan config:clear
php artisan optimize

【讨论】:

    【解决方案2】:

    将您的 .env 文件更改为:

    DB_CONNECTION=mysql
    
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=sales_report
    DB_USERNAME=root
    DB_PASSWORD=
    
    DB2_HOST=Host_name
    DB2_PORT=1433
    DB2_DATABASE=DB_name
    DB2_USERNAME=user
    DB2_PASSWORD=password
    

    然后在您的 config/database.php 中更改 SQL 服务器配置以使用新名称:

    ...
     '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' => '',
                'prefix_indexes' => true,
                'strict' => true,
                'engine' => null,
                'options' => extension_loaded('pdo_mysql') ? array_filter([
                    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                ]) : [],
            ],       
            // ...
            'sqlsrv' => [
                'driver' => 'sqlsrv',
    
                'host' => env('DB2_HOST', 'localhost'),
                'port' => env('DB2_PORT', '1433'),
                'database' => env('DB2_DATABASE', 'forge'),
                'username' => env('DB2_USERNAME', 'forge'),
                'password' => env('DB2_PASSWORD', ''),
                'charset' => 'utf8',
                'prefix' => '',
                'prefix_indexes' => true,
            ],
    
        ],
    ...
    

    这样做会将默认数据库设置为mysql,但您可以在每个模型或查询构建器中使用备用连接:

    class User extends Authenticatable
    {
        use Notifiable;
        protected $connection = 'sqlsrv';
    

    DB::connection('sqlsrv')->table('users')->...
    

    您可以通过更改.env 文件中的DB_CONNECTION 条目来更改默认设置,但随后您需要在需要时覆盖与mysql 的连接。

    【讨论】: