2016-01-15 33 views
1

我有一個大型項目,每個客戶都有自己獨立的數據庫。爲了實現這一目標,我們使用自定義的.env加載程序,通過檢查客戶子域(每個客戶都是唯一的)加載每個客戶.env動態環境文件(多個數據庫)和工匠命令

但是,這當然不適用於手工命令。例如,當我想要遷移時,我需要一次遷移所有數據庫。所以我建立了一個Artisan命令,取得文件.env並循環,然後調用默認的artisan migrate。但它沒有按預期工作。

我試過了一切;例如:

$dotenv = new Dotenv('/env', '.test.env'); 
$dotenv->overload(); 

和:

app()->useEnvironmentPath('/env'); 
app()->loadEnvironmentFrom('.test.env'); 

甚至:

config('database.connections.mysql.database', 'test_database'); 

當我運行$this->call('migrate');應用程序默認爲默認.env並在運行時忽略所有的自定義設置。有沒有人有關於我如何可以重載遷移命令選擇數據庫的想法?

注:我知道我可以手動設置多個連接在config/database.php(例如像:Overriding Default Laravel database configuration for artisan migrate commands),但是,圖像的幾十個客戶,這不會是可行的。

+0

您可能對我很久以前寫過的東西感興趣 - https://github.com/mnabialek/laravel-multi-config/tree/develop和https://github.com/mnabialek/laravel-multi -domain/tree/develop(目前還未測試) –

+0

感謝您的評論;儘管這個結果與我所尋找的「半遠」有關。感謝分享! – Marcus

回答

0

經過了很多問題後,我才能夠用這種方法對它進行排序;

在Laravel 5中,似乎在Config::set(),config('config',['key' => 'value])config()-set('config', ['key' => 'value'])中存在差異。

經過很多測試不同的變體後,我們設法以這種方式獲得解決方案;

$connection = 'connection'; 
$iterator = 0; 

foreach ($files as $file) { 
    App::useEnvironmentPath('/env'); 
    App::loadEnvironmentFrom('.file.env'); 

    // Create a new connection "on the fly" 
    config()->set('database.connections.' . $connection . '_' . $iterator, [ 
     'driver' => 'mysql', 
     'host'  => env('DB_HOST'), 
     'database' => env('DB_DATABASE'), 
     'username' => env('DB_USERNAME'), 
     'password' => env('DB_PASSWORD'), 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
     'strict' => false, 
    ]); 

    // Call regular migration command 
    $this->call('migrate', ['--force' => true, '--database' => $connection . '_' . $iterator]); 

    $iterator++; 
} 

這管理設置多個新的連接到MySQL數據庫,然後種子他們每一個。

感謝@大衛艾倫這裏的靈感。

2

我不得不做,正在由控制檯命令來創建SQLite數據庫類似的東西,而且我能得到遷移到運行的唯一方法是通過動態創建一個數據庫配置:

Config::set('database.connections.'.$config_key, array(
      'driver' => 'sqlite', 
      'database' => storage_path($database_name), 
      'prefix' => '', 
)); 

然後我會調用遷移命令:

Artisan::call('migrate', [ 
     '--database' => $config_key, 
     '--path' => 'database/offline/'.$type.'/migrations', 
    ]); 
+0

真的嗎?嗯,這非常有趣 - 將檢查它並回來。謝謝一堆! – Marcus