2017-10-16 554 views
1

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

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

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

回答

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

0

在laravel你可以做什么是创建该文件的conf /数据库的连接阵列中不同的连接,那么这些连接可以使用它们的时候你要在你的应用程序进行操作。

如果使用查询生成器原料expresions必须使用连接(“名称”)方法执行查询,例如:

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

如果你使用口才,你可以指定例如:连接属性中模型文件中连接的名称,例如:

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

0

您需要首先获得配置..然后改变特定领域然后把它放回去..

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

此设置在下一个请求中更改为默认值 – tyro

+1

您需要在中间件中执行... – ZeroOne