在 Laravel 中动态更改数据库连接 [重复]

Posted

技术标签:

【中文标题】在 Laravel 中动态更改数据库连接 [重复]【英文标题】:Change the Database Connection Dynamically in Laravel [duplicate] 【发布时间】:2018-03-28 06:24:19 【问题描述】:

我的主数据库带有登录表和每个用户的相应数据库设置。登录时,我应该动态更改从表中获取的数据库设置。 我可以更改数据库连接,但这不是持久的。

Config::set("database.connections.mysql", [
'driver' => 'mysql',
"host" => $usr_host,
"database" => $usr_database,
"username" => $usr_username,
"password" => $usr_password,
...
]);

编辑: 当每个用户注册应用程序时,都会为每个用户创建新数据库,因此我没有在 config/database.php 中定义的每个用户的数据库连接

【问题讨论】:

这能回答你的问题吗? Laravel: connect to databases dynamically 【参考方案1】:

您可以使用默认数据库进行用户登录,并为数据库名称添加一个新字段。然后,每当您需要查询不同的数据库时,您只需更改您的数据库连接即可。

类似的东西

$someModel = new SomeModel;
$databaseName = "mysql2"; // Dynamically get this value from db
$someModel->setConnection($databaseName);
$something = $someModel->find(1);

您可以在此处阅读有关它的更多信息。 http://fideloper.com/laravel-multiple-database-connections

【讨论】:

如果我不使用模型怎么办,而我只使用 ::table 好吧,这并不优雅,也不推荐它,但更简单的方法是更改​​ app/config/database.php 中返回的数组。因此,如果满足条件,则添加一些条件,然后返回辅助数据库详细信息,否则您始终返回主数据库详细信息。【参考方案2】:

在 laravel 中,你可以在 conf/database 文件的连接数组中创建不同的连接,然后你可以在你的应用程序中执行操作时使用这些连接.

如果您使用 query builder原始表达式,则必须使用 connection ('name') 方法来执行查询,例如:

$users = DB::connection('mysql')
         ->table('users')
         ->select(...)
         ->get();

如果使用eloquent可以在模型文件的connection属性中指定连接的名称,例如:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model

    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'mysql';

您的问题的解决方案可能是您根据文件conf/database中的用户创建了不同类型的连接,并将用户使用的连接名称保存为用户表中的列,当您进行查询时,您将获得用户连接的名称,例如:

$user = User::find(Auth::id());
$connection = $user->connection;

$users = DB::connection($connection)
                      ->table('users')
                      ->select(...)
                      ->get ();

更多信息:

https://laravel.com/docs/5.5/eloquent#eloquent-model-conventions https://laravel.com/docs/5.5/database#read-and-write-connections

【讨论】:

【参考方案3】:

您需要先获取配置..然后更改特定字段然后将其设置回来..

$config = Config::get('database.connections.company');
$config['database'] = "company_tenant_$id";
$config['password'] = "test2123";
config()->set('database.connections.company', $config);

【讨论】:

此设置在下一个请求中更改为默认值 我必须在哪里/哪个文件执行此操作?我只是迷路了。请让我知道我可以执行此操作的确切文件路径。我只想能够做一次,然后我不再需要在每个类和容器中每次都做。【参考方案4】:

这样你可以在数据库中设置新的参数:

 \Config::set('database.connections.mysql.database', $schemaName);

记住PURGE 以保留此设置

 DB::purge('mysql');

干杯!

【讨论】:

DB类的purge函数很有用。 您的回答对我很有帮助,非常感谢。有一种情况是我们只需要更改连接数据库名称,因为我们可能有相同的连接但有多个数据库【参考方案5】:

我认为更改数据库连接位置的好地方是bootstrap/app.php文件,使用下面的代码:

$app->afterBootstrapping(\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, function ($ap) 
    // your database connection change may happens here
);

它是在ServiceProvider注册和启动之前,所以即使你在ServiceProvider中使用DBEloquent人员,它也能很好地工作。

【讨论】:

但是我需要检查用户是否登录然后我想使用动态数据库连接,否则我想使用默认登录数据库(用户只能查看登录页面和仅此而已) 我刚试过你的方法。我真的很喜欢按照你的方式去做。但是当我想检查用户是否登录时,在该代码块中,它说未定义 Auth 类。如何访问该代码块内的 Auth 类?如果我能够检查用户是否已登录,那么我将为此做好准备。【参考方案6】:

经过大量搜索后,我发现它是这样的:

转到这个文件vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php

转到方法:protected function authenticate($request, array $guards) 在方法启动后,粘贴以下代码:

    if(auth()->check() && !empty( auth()->user()->db_name ))

        $dynamic_db_name = auth()->user()->db_name;
        $config = \Config::get('database.connections.mysql');
        $config['database'] = $dynamic_db_name;
        $config['password'] = "Your DB Password";
        config()->set('database.connections.mysql', $config);
        \DB::purge('mysql');
    

首先我们检查用户是否使用

auth()->check()

然后,您可能已根据每个用户将 db_name name 或类似的列表添加到您的用户表中。所以在下一个条件下,我确保 db_name 可用:

&& !empty( auth()->user()->db_name )

然后执行后进入if条件我从用户记录中获取db_name并根据用户数据库设置配置,保存配置并使用DB类的purge方法来持久化这个设置。 我真的被它困住了。我不想在每个班级都更改我的数据库连接。所以这就是我得到它的方式。现在我可以在任何地方都使用 Eloquent 和 DB 而没有任何压力。在我的应用程序中,我有一个用于所有用户登录的中心数据库,然后每个组织都有一个不同的数据库。所以在用户登录后,我不需要中心数据库(登录数据库),我只需要用户/组织特定的数据库。所以这就是我让它工作的方式。

【讨论】:

以上是关于在 Laravel 中动态更改数据库连接 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在laravel中动态连接多个数据库[重复]

如何动态更改/解析 Laravel 5 中的数据库连接?

Laravel更改数据库连接[重复]

Laravel 中的动态数据库更改

在 laravel 刀片模板中动态更改每个用户的背景图像

在 laravel 中使用 x-editable 更改动态状态