【问题标题】:Laravel change db at runtimeLaravel 在运行时更改数据库
【发布时间】:2020-08-19 18:28:45
【问题描述】:

我有一个应用程序,其中包含用于登录用户的一级数据库和用于一个或多个用户的 N 个数据库。 我想在用户登录后更改数据库。 数据库参数存储在用户表中,所以登录后我有这个:

        Config::set("database.connections.mysql", [
        "host" => "localhost",
        "driver" => "mysql",
        'default' => 'mysql',
        "database" => $dati->db,
        "username" => "root",
        "password" => ""

    ]);


    DB::reconnect('mysql');

其中 $dati->db 是登录用户的数据库名称。 它仅在当前控制器中有效,但所有其他模型和控制器都没有新的数据库,并为丢失的表返回错误。

如何将新设置传播到所有模型?

提前致谢。

【问题讨论】:

  • 一般不建议每个用户拥有 1 个数据库。除非有特定的原因,否则我建议将所有用户放入 1 个具有所需访问控制的数据库中。
  • 您好 nigel,非常感谢您的回答,存在误会。一个包含所有用户(权限、级别等)的数据库,每个用户都有一个数据库(两个或多个用户可以拥有相同的数据库)。登录后我想更改数据库连接(参数在用户的数据库中)以连接用户的数据库。

标签: php database laravel


【解决方案1】:

你应该把它放到一个中间件中。 例如:

<?php
class UserDatabaseMiddleware {
    public function handle($request, \Closure $next){
        $databaseName = $request->user()->db;
        config(['database.connections.mysql.database' => $databaseName]);
        return $next($request);
    }
}

那么你应该在 App\Http\Kernel.php 中定义它

<?php
protected $routeMiddleware = [
    'dbselect' => UserDatabaseMiddleware::class
]

最后你可以将它添加到你的路由文件中。例如:

<?php
Route::group([
    'middleware' => 'dbselect',
], function(){
    Route::get('/', [MyController::class, 'myMethod'])->name('index');
})

现在如果用户登录,配置应该随着每个 http 请求而改变。

重要: 正如 cmets 中提到的那样 - 每个用户拥有多个数据库是一种不好的方法。你应该考虑一下。 还有另一种方法可以做到这一点 - 您可以为表中的每条记录设置 user_id,然后创建全局范围以仅选择登录用户的记录。

【讨论】:

  • 嗨 katsarov,谢谢,我会试试这个方法。我想我误解了,我在第一级有一个数据库,其中包含用户、角色、权限等,还有 N 个数据库用于 NNN... 用户,一个用户可以登录一个数据库,显然有些用户使用相同的数据库。
猜你喜欢
  • 2016-05-29
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多