我如何使用laravel多数据库?

时间:2019-04-26 05:31:11

标签: php database laravel

我想了解laravel多个数据库。是否可以使用仅使用用户登录名的默认数据库,登录后按组单独分组,每个组使用独立数据库。例如'db'是默认数据库,仅用于所有用户登录。

示例:现在,使用默认数据库'John'登录'db'。 John登录后,John是group1的成员。john使用'db1'存储John's所有类型的数据。另一面现在,'Alex'使用默认数据库'db'登录。登录后,Alex是group2的成员。Alex使用'db2'存储Alex's所有类型的数据。登录后不需要默认数据库连接,因此我想替换'bd' to 'db1' or 'db' to 'db2'。请提供laravel代码

2 个答案:

答案 0 :(得分: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来了解它是如何在后台运行的。

答案 1 :(得分:0)

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

您可以在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,
],
...

不过,您还需要一种方法为每个用户指定将从哪个其他外部DB提取其详细信息,例如db_name表上的列users

在获取诸如'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

...