在Laravel中动态更改数据库连接

时间:2017-10-16 16:49:24

标签: php mysql database laravel multi-tenant

我拥有主数据库,其中包含每个用户的登录表和相应的数据库设置。在登录时,我应该动态更改从表中获取的数据库设置。 我可以更改数据库连接,但这不会持续存在。

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

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

6 个答案:

答案 0 :(得分:3)

这样,您可以在涉及数据库时设置新参数:

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

记住PURGE,以保留此设置

 DB::purge('mysql');

干杯!

答案 1 :(得分: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

答案 2 :(得分:1)

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

public class FindPermutations {
public static void main(String[] args) {

    System.out.println(numPerms(new String("xacxzaa"),
            new String("fxaazxacaaxzoecazxaxaz")));
    System.out.println(numPerms(new String("ABCD"),
            new String("BACDGABCDA")));
    System.out.println(numPerms(new String("AABA"),
            new String("AAABABAA")));

    // prints 4, then 3, then 3
}

public static int numPerms(final String a, final String b) {
    int sum = 0;
    for (int i = 0; i < b.length(); i++) {
        if (permPresent(a, b.substring(i))) {
            sum++;
        }
    }
    return sum;
}

// is a permutation of a present at the start of b?
public static boolean permPresent(final String a, final String b) {
    if (a.isEmpty()) {
        return true;
    }

    if (b.isEmpty()) {
        return false;
    }

    final char first = b.charAt(0);
    if (a.contains(b.substring(0, 1))) {
        // super ugly, but removes first from a
        return permPresent(a.substring(0, a.indexOf(first)) + a.substring(a.indexOf(first)+1, a.length()),
                b.substring(1));
    }
    return false;
}
}

答案 3 :(得分:0)

在laravel中,你可以做的是在文件 conf / database 的连接数组中创建不同的连接,然后在你要在应用程序中执行操作时可以使用它们。

如果您使用查询构建器原始展示,则必须使用连接('name')方法执行查询,例如:

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

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

<?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

答案 4 :(得分:0)

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

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

这是在ServiceProvider注册和引导之前进行的,因此,即使您在ServiceProvider中使用DBEloquent人员,也可以很好地工作。

答案 5 :(得分:0)

广泛搜索后,我发现这种情况:

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

转到方法:受保护的函数authenticate($ request,数组$ 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名称或类似的列表。因此,在下一个条件下,我要确保db_name可用:

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

然后在执行后进入if条件,我从用户记录中获取db_name并根据用户数据库设置配置,保存配置并使用DB类的清除方法保留此设置。 我真的很坚持。我不想在每个类中更改数据库连接。这就是我的方法。现在,我可以在没有任何紧张的情况下使用Eloquent和DB。在我的应用程序中,我有一个中心数据库供所有用户登录,然后对于每个组织都有一个不同的数据库。因此,在用户登录后,不需要中心数据库(登录数据库),而是需要用户/组织特定的数据库。所以这就是我如何使其工作。