如何在 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:在多个域上共享会话数据

如何从多个控制器获取数据到 Laravel Blade 视图中?

如何在 Laravel 中更改用户表?

如何在 Laravel 5.7 中将多个数据库数据传递到 jQuery 的自动完成(AJAX)中

如何根据用户在 Laravel 5 中的角色选择用户?

如何通过在laravel中填写相同的表格来为多个用户分配任务?