2017-10-16 555 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