2014-09-20 126 views
4

在我的應用程序中,每個用戶都有自己的數據庫,這是在用戶註冊時創建的。連接和數據庫數據(數據庫名稱,用戶名,密碼)保存在默認數據庫的表中。Laravel:在另一個數據庫上運行遷移

try{ 
    DB::transaction(function() { 

     $website = new Website(); 
     $website->user_id = Auth::get()->id; 
     $website->save(); 

     $database_name = 'website_'.$website->id; 

     DB::statement(DB::raw('CREATE DATABASE ' . $database_name)); 

     $websiteDatabase = new WebsiteDatabase(); 
     $websiteDatabase->website_id = $website->id; 
     $websiteDatabase->database_name = $database_name; 
     $websiteDatabase->save(); 

    }); 
} catch(\Exception $e) { 
    echo $e->getMessage(); 
} 

現在我想在創建新用戶數據庫後運行一些遷移。

可能嗎?

感謝

+2

爲您的數據庫添加laravel環境並在這些環境中調用artisan工具?你爲什麼要爲每個客戶創建一個數據庫?這聽起來像是一個Laravel應用程序的通常決定。 – 2014-09-20 19:11:21

+0

我們的Web應用程序類似於http://wix.com。每個用戶都可以爲自己創建網站,我們希望每個網站都有自己獨立的數據庫。在這段代碼中,我爲每個用戶創建了單獨的數據庫,並將其數據保存在默認數據庫中,現在我想在這個新數據庫上運行一些遷移以創建新的數據庫模式。 – 2014-09-21 17:53:02

回答

12

在您的應用程序/配置/ database.php中,你必須:

<?php 
return array(

    'default' => 'mysql', 

    'connections' => array(

     # Our primary database connection 
     'mysql' => array(
      'driver' => 'mysql', 
      'host'  => 'host1', 
      'database' => 'database1', 
      'username' => 'user1', 
      'password' => 'pass1' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 

     # Our secondary database connection 
     'mysql2' => array(
      'driver' => 'mysql', 
      'host'  => 'host2', 
      'database' => 'database2', 
      'username' => 'user2', 
      'password' => 'pass2' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 
    ), 
); 

現在,你準備在遷移兩個數據庫連接,你可以這樣做:

Schema::connection('mysql2')->create('some_table', function($table) 
{ 
    $table->increments('id'): 
}); 

這應該工作。 更多的相關信息上:http://fideloper.com/laravel-multiple-database-connections

+0

我在配置文件中沒有輔助數據庫連接。數據庫連接詳細信息保存在主數據庫中! – 2014-09-21 15:28:19

+1

我認爲你應該澄清你的問題,也許顯示一些代碼,使其可以理解... – pietrovismara 2014-09-21 16:18:18

+0

我插入代碼的問題。謝謝 – 2014-09-21 17:50:37

2

如果將數據庫配置上database.php文件,這可以幫助你:

php artisan migrate --database=**otherDatabase** 
0

我想,我終於想通了這個爛攤子......這個解決方案並不需要配置每個租戶的數據庫,並且只能運行一次。

class MigrationBlah extends Migration { 
    public function up() { 
    $dbs = DB::connection('tenants')->table('tenants')->get(); 
    foreach ($dbs as $db) { 
     Schema::table($db->database . '.bodegausuarios', function($table){ 
     $table->foreign('usuario')->references('usuarioid')->on('authusuarios'); 
     }); 
    } 
    } 
} 

如果我有一個名爲「租戶」我database.php文件,它包含了所有我的租戶的數據庫名稱連接。我的默認連接也設置到我的租戶數據庫中。該數據庫是負責照顧遷移表的人員。

使用foreach語句,它通過租戶數據庫並在每個數據庫上運行遷移。

在您的默認連接上,您應該配置可訪問所有租戶數據庫的用戶以使其工作。

+0

通過使用此方法,您無法爲單個承租人遷移。 – 2018-02-07 09:56:37

相關問題