【问题标题】:how can i use laravel multi-database?如何使用 laravel 多数据库?
【发布时间】:2019-04-26 17:17:26
【问题描述】:

我想了解 laravel 多数据库。是否可以使用仅使用用户登录的默认数据库,并且在登录后按组分开,每个组都使用独立的数据库。比如'db'是默认数据库,它只用于所有用户登录。

示例:现在'John' 使用默认数据库'db' 登录。登录后,John 是 group1 的成员 john 使用 'db1' 其中存储了 John's 所有类型的数据。另一边 现在'Alex' 使用默认数据库'db' 登录。亚历克斯登录亚历克斯后是组2的成员,亚历克斯使用'db2'存储Alex's所有类型的数据。登录后默认数据库连接不需要所以我想替换'bd' to 'db1' or 'db' to 'db2'。请提供 laravel 的代码

【问题讨论】:

标签: php database laravel


【解决方案1】:

config/database.php中定义一个单独的数据库连接。

'mysql' => [ // default
    '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', ''),
    ...
],
'db1' => [ // another 
    'driver' => 'mysql',
    'host' => env('DB_HOST_ONE', '127.0.0.1'),
    'port' => env('DB_PORT_ONE', '3306'),
    'database' => env('DB_DATABASE_ONE', 'forge'),
    'username' => env('DB_USERNAME_ONE', 'forge'),
    'password' => env('DB_PASSWORD_ONE', ''),
    ...
]

注意,您必须在 .env 中定义相应的配置。

那么当你想使用db1连接它时,使用Config::set('database.default', 'db1')。但是,它仅在您知道数据库连接数量(您可以在config/database.php 中定义)时才有效,如果您的数据库数量未知,那么您应该直接更改配置而不是仅更改连接名称。

例子:

Config::set('database.connections.mysql.database', 'db1')
Config::set('database.connections.mysql.username', 'admin');
Config::set('database.connections.mysql.password', 'secret');

您可以查看my another answer 以了解它在引擎盖下的工作原理。

【讨论】:

    【解决方案2】:

    在这种情况下,我假设您正在构建一个系统,该系统连接到可能来自不同应用程序的各种现有数据库。

    您可以在config/database.php 中定义任意数量的数据库连接

    '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,
    ],
    
    'mysql2' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST_2', '127.0.0.1'),
        'port' => env('DB_PORT_2', '3306'),
        'database' => env('DB_DATABASE_2', 'forge'),
        'username' => env('DB_USERNAME_2', 'forge'),
        'password' => env('DB_PASSWORD_2', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
    ...
    

    但是,您还需要一种方法来为每个用户指定将从哪个其他外部数据库获取他们的详细信息,例如users 表上的列db_name

    在获取 'Alex' 用户模型的数据时,您可以执行类似的操作

    $user = User::find(1); //if Alex has user_id 1 and where $user->db_name is 'mysql2' as is in the config/database.php file
    
    $userDetails = DB::connection($user->db_name)->where('username',$user->name)->where('other_details','some details')->get();
    

    确保在您的 .env 中也指定此内容,以匹配 config/database.php 中定义的内容

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=homestead
    DB_USERNAME=homestead
    DB_PASSWORD=secret
    
    DB_HOST_2=127.0.0.1
    DB_PORT_2=3306
    DB_DATABASE_2=db2_name_here
    DB_USERNAME_2=db2_username_here
    DB_PASSWORD_2=db2_password_here
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 2019-09-13
      • 2015-01-20
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2022-08-11
      • 2020-07-12
      相关资源
      最近更新 更多