如何在 Laravel 中使用多个数据库并随用户更改数据库连接? [复制]
Posted
技术标签:
【中文标题】如何在 Laravel 中使用多个数据库并随用户更改数据库连接? [复制]【英文标题】:How to use Multiple database in Laravel and database connection change with User? [duplicate] 【发布时间】:2019-12-16 03:37:39 【问题描述】:我想创建用户基础数据库,例如在我的系统中有两个用户 A 和 B。我有一个主数据库和两个数据库 user_a(用于用户 A)和 user_b(用于用户 B)。在主数据库中,我拥有所有用户信息。现在我想要的是,当用户 A 登录系统时,它访问 master 数据库和 user_a 数据库,当用户 B 登录时,数据库连接应该是 master 数据库和 user_b 数据库。
【问题讨论】:
“百万用户”...您是否正在尝试构建 SaaS 解决方案?在这种规模下,您可能希望每个帐户以及数据库都有一个单独的应用程序实例,以应对需求。也许看看容器化。否则,不清楚为什么您甚至需要为每个用户使用单独的数据库 P.S.这是一个问答网站,但您似乎只是发布了一个解决方案,没有提出任何问题。您可以通过将您的帖子拆分为初始问题(在“问题”部分中,然后在“答案”部分中添加您的解决方案来使其适合站点格式。这也使其他人有可能提出替代解决方案并让他们由社区投票。这就是网站的运作方式。如果你不这样做,你的帖子就有被关闭的风险,因为它没有寻求帮助 P.S.如果您只想发布代码 sn-ps 或工作解决方案,请创建一个博客。这不是本网站的用途。 @ADyson,是的,它是一种带有拥抱数据的 SaaS 解决方案。我同意这是问答网站,我只是为了帮助某人而发帖。谢谢 如果有其他更好的解决方案,请帮忙。它会给我方法。非常感谢 【参考方案1】:这是我在@ADyson 建议后的回答
我在 INTERNET 上进行了很多搜索,但没有找到任何完美的解决方案。
有一些博客只解释了创建两个或多个连接 database.php 配置文件,然后使用 $connection 在模型中访问这些连接。
是的,我同意这是一个很好的解决方案,但是,如果我的系统中有数百万用户,我不想手动在 database.php
文件上创建所有连接。
所以我做了一个实验,它对我有用,我想把这个解决方案分享给所有其他开发人员。
首先我在主数据库中为所有用户的数据库名称提供一个选项(超级管理员可以在超级管理员创建用户后添加数据库名称,就像在我的系统中一样)
其次,我创建了一个Middleware DatabaseSwitcher.php
并在Kernel.php
中全局注册了这个中间件,并在web.php
中的auth 中间件之后调用这个中间件:
(['middleware' => ['auth', 'DatabaseSwitcher']]).
下面是中间件的代码。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Guard;
use Config; //to get configuration data
class DatabaseSwitcher
/**
* The Guard implementation.
*
* @var Guard
*/
protected $auth;
/**
* Create a new filter instance.
*
* @param Guard $auth
* @return void
*/
public function __construct(Guard $auth)
$this->auth = $auth;
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
//check if user logged in
if ( !$this->auth->guest() )
//get authenticate user information
$user = $this->auth->user();
//get user's database
$user_db = $user->user_database;
//first get default mysql connection array and use in new variable for new connection which will create dynamically.(default connection is defined in database.php config file)
$dbConfig = config('database.connections.mysql');
//now use database name which is in user record;
$dbConfig['database'] = $user_db;
//now set a new database connection name is mysql_new in my case
Config::set("database.connections.mysql_new", $dbConfig);
//now set default connection which is created for the user
Config::set("database.default", 'mysql_new');
//now there are two connection one for master (mysql) and other for user(mysql_new) and default connection is (mysql_new)
//we can access these two connection in every models by using $connection as mentioned in Larave documentation.
return $next($request);
现在我们可以通过使用标准结构或类似 laravel 在模型中动态使用数据库连接:
protected $connection = 'mysql';
protected $connection = 'mysql_new';
一切都很好,但是当我们使用 unique 并且存在时,Laravel 验证规则仍然可能存在问题。
为了克服这个问题,我使用了唯一且存在规则的连接名称。 例如 //connection 应该是数据库连接的名称,例如 mysql 和 mysql_new(在我的例子中)
'name' => 'required|unique:connection.users,name',
'email' => 'required|exist:connection.users,email',
我希望它可以帮助所有其他想要看起来像这样的系统的开发人员。 对不起我的英语,因为我不是语法专家。
【讨论】:
角色和权限可能有问题,为了克服这个问题,可以在roles.php配置文件中的角色和权限中提到要使用什么连接以上是关于如何在 Laravel 中使用多个数据库并随用户更改数据库连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何从多个控制器获取数据到 Laravel Blade 视图中?