2013-07-01 188 views
26

我想有時連接到另一個數據庫。Laravel 4 - 連接到其他數據庫

我用數據庫連接數據創建了一個config.php。

但我怎麼能告訴laravel連接到這個數據庫insted使用config/database.php?

例如,使用Schema類時。

由於沒有人似乎明白我想要什麼。

我不想使用config/database.php,我想在不同的位置使用不同的配置文件。

+0

既然你不給任何特定代碼爲「端口」,看看[這裏](http://forums.laravel.io /viewtopic.php?pid=6387)以防它回答你的問題。 –

+0

什麼代碼?正如我所說我想創建一個額外的config.php與數據庫設置並連接到此。問題是我如何告訴laravel使用config/database.php的配置。 – Michael

+0

鏈接的頁面顯示如何將多個數據庫配置添加到database.php,以及如何選擇使用哪一個來連接/查詢。 –

回答

55

這聽起來像你想通了。無論如何,對於其他進來的人來說,我會如何實現它,或者萬一有用的東西在你身上。

第一個,在app/config/database.php中添加第二個連接。注意:該文件路徑可能會根據您的環境而改變。

<?php 
return array(
    'connections' => array(
     'mysql' => array(
      'driver' => 'mysql', 
      'host'  => 'localhost', 
      'database' => 'database1', 
      'username' => 'user1', 
      'password' => 'pass1' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 

     'mysql2' => array(
      'driver' => 'mysql', 
      'host'  => 'localhost', 
      'database' => 'database2', 
      'username' => 'user2', 
      'password' => 'pass2' 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
     ), 
    ), 
); 

,在你的代碼,你可以使用(如前所述)第2連接,你想:

Schema::connection('mysql2')->create('users', function($table) {})

還有更多的文檔在這一點 - 看到Accessing Connections

Eloquent ORM 您可以在eloquent類中定義變量「connection」來設置使用哪個連接。這在Basic Usage部分中提到。

請參閱here on Github上的變量以及您可以設置爲動態設置連接的方法here

編輯 OP已經明確表示他們不希望使用config/database.php文件進行配置。

但是,如果沒有進一步解釋,我不能發表評論。我很樂意提供幫助 - 聽起來好像知道爲什麼 config/database.php文件不能/不應該被使用,因爲這可以幫助我們確定問題並創建一個有用的解決方案。

+1

我使用的是ModulSystem。請說明原因;) – Michael

+0

驗證呢?例如「存在」驗證規則。你如何告訴它使用其他連接/數據庫? – cen

+0

您可以覆蓋它在[驗證服務提供商]中設置的連接(https://github.com/laravel/framework/blob/4.1/src/Illuminate/Validation/ValidationServiceProvider.php#L30)。我不知道是否需要在數據庫連接之間切換。你將不得不深入代碼並做一些擴展/重載。 – fideloper

11

請記住,Laravel 4實際上是一個組件集合,您可以單獨使用這些組件。

https://github.com/illuminate/database

這裏有,展示瞭如何用膠囊類交互的示例工作:

use Illuminate\Database\Capsule\Manager as Capsule; 

$capsule = new Capsule; 

$capsule->addConnection([ 
    'driver' => 'mysql', 
    'host'  => 'localhost', 
    'database' => 'database', 
    'username' => 'root', 
    'password' => 'password', 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
]); 

// Set the event dispatcher used by Eloquent models... (optional) 
use Illuminate\Events\Dispatcher; 
use Illuminate\Container\Container; 
$capsule->setEventDispatcher(new Dispatcher(new Container)); 

// Set the cache manager instance used by connections... (optional) 
$capsule->setCacheManager(...); 

// Make this Capsule instance available globally via static methods... (optional) 
$capsule->setAsGlobal(); 

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher()) 
$capsule->bootEloquent(); 

這是一串引導,你需要運行的,所以將它保存起來在某個功能或方法的某處。

但是,它絕對有可能。

5

有一個更簡單的解決方案。如果你使用的是Larave 4,那麼這個選項對我來說很有用。最近他們添加了可以在模型中指定的$ table變量。請參閱this link

class User extends Eloquent { 

    protected $table = 'my_users'; 

} 

如果你正在使用MySQL,你可以做到以下幾點:

class User extends Eloquent { 

    protected $table = 'mydbname.my_users'; 

} 

如果您正在使用SQL Server,你可以這樣做:

class User extends Eloquent { 

    protected $table = 'mydatabase..my_users'; 

} 

我的配置文件有DB1指定,但我創建了一個模型,它想要在同一個MySQL主機上訪問DB2。所以這是一個快速和骯髒的方式來實現這一點。

現在我並沒有完全利用雄辯的ORM,所以這個「黑客」可能不適用於多對多或一對多的雄辯方法。

彼此的想法,我有,但我並沒有想在DB1和內部的程序,我可以通過查詢此鏈接訪問DB2表的創建存儲過程(常規):

SELECT * from db2.mytable where id = 1; 
+0

如果您對有/可以擁有相同的用戶訪問這兩個數據庫感到滿意,這是一個非常漂亮優雅的解決方案。 – voidstate

1

編輯bootstrap/start.php文件並添加您的機器名稱(打開終端:hostname)。

你的機器添加到$ ENV,

$env = $app->detectEnvironment(array(
    'mymachine' => array('mymachine.local'), 
)); 
  1. 創建於'app/config/mymachine'
  2. 一個新的路徑添加的database.php一個副本,新的配置PARAMS。
3

要在其他地方使用的配置文件,說src/config

use Config; 


$this->dbConfig = Config::get('appname::dbInfo.connections.test'); 
$this->database = $this->dbConfig['database']; 
$this->username= $this->dbConfig['username']; 
$this->password= $this->dbConfig['password']; 

dbInfo是在你的應用程序的src/config目錄一個簡單的PHP文件返回一個包含元素connections這是數據庫的一個數組的數組屬性。

你可以告訴Laravel通過使用外部配置文件:

Config::set("database.connections.test", $this->dbConfig); 
DB::connection("test"); 
10

我相信你想實現某種形式的地方數據庫將被動態創建的邏輯分片。

在laravel這種情況下,您可以動態地添加數據庫配置,如下面

$conn = array(
    'driver' => 'mysql', 
    'host'  => 'localhost', 
    'database' => 'DATABASE', 
    'username' => 'USERNAME', 
    'password' => 'SOME_PASSWORD', 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
); 

Config::set('database.connections.DB_CONFIG_NAME', $conn); 

我們通過連接雄辯

MODEL::on('DB_CONFIG_NAME')->WHAT_EVER('1'); 

查詢生成器的櫃面你可以做

$DB = DB::connection('DB_CONFIG_NAME'); 

現在使用$DB->select()進行查詢。

希望這將幫助開發者尋找一個可能的解決方案對於這個問題

+0

這似乎不適用於Laravel 5.2,DatabaseManager.php:239拋出異常'Database [database.connections.DB_CONFIG_NAME]'not configured。'我也試過App :: make('config') - > set('database.connections.DB_CONFIG_NAME',$ conn)',結果相同。任何想法? –

+0

對不起,我的錯。我錯過了簡單的事實,即稍後在引用配置的連接時不需要'database.connections.'前綴。出於某種原因,錯誤信息完全讓我失望。 –