2017-09-26 86 views
0

因此,我正在製作一個Web應用程序,該應用程序應該能夠按計劃將任何SQL語句上載到數據庫中列出的任何服務器。它應該連接到數據庫,執行語句並根據收到的信息進行報告。然後它可以斷開。能夠通過Laravel在運行時更改數據庫連接

目前,我有一個適當的工作,它抓住了從數據庫中所需的所有信息,例如。主機,端口,DBName等我只需要形成一個連接,然後執行該語句。

我正在使用Laravel框架。

編輯:我無法修改任何數據庫配置,因爲數據庫信息存儲在表中,而不是配置文件。

感謝

+0

配置表建模/一個PHP類?如果是這樣的話,你可能會設置一些讓你將該類設置爲活動的東西。也許。 – Kyrre

回答

0

您可以在運行時設置這樣說:

$connKey = 'CustomConnection'; 

$dbInfo = DatabaseInfo::find($databaseId); 

Config::set('database.connections.' . $connKey, array(
    'driver' => 'mysql', 
    'host'  => $dbInfo->hostName, 
    'database' => $dbInfo->database, 
    'username' => $dbInfo->username, 
    'password' => $dbInfo->password, 
    'charset' => 'utf8', 
    'collation' => 'utf8_general_ci', 
    'prefix' => '', 
)); 

// Now you can set the new connection to the models 

$myModel = new MyModel; 
$myModel->setConnection($connKey); 

// Or you can use it this way too: 
$users = DB::connection($connKey)->select(...); 

// Or, also: 
$pdo = DB::connection($connKey)->getPdo(); 
0

我解決了這個在一個非常類似的方式來一個貼:

$connectionName = Crypt::encryptString(str_random(80)); 


    DB::purge("$connectionName"); 


    Config::set("database.connections.$connectionName", [ 
     "driver" => "$Driver", 
     "port" => "$Port", 
     "host" => "$Host", 
     "database" => "$DBName", 
     "username" => "$UserName", 
     "password" => "$Password" 
    ]);   


    $query = DB::connection("$connectionName")->select($statement); 

    $query= json_decode(json_encode($query), true); 


    Excel::create("$filename-$mytime", function($excel) use ($query, $filename) { 

      $excel->sheet("$filename", function($sheet) use ($query){ 

       $sheet->fromArray($query); 

      }); 

     })->store('xls', storage_path('excel/exports')); 

這將創建一個新的連接一個隨機的名字(所以如果在一個隊列中,如果執行了多個它們不會清除同一個數據庫),給它分配細節,執行在變量$語句中定義的select語句。然後從中創建一個Excel電子表格。