2013-12-16 87 views
0

我正在使用Laravel 4在一個項目中使用postgres-db。公共模式是管理員的主要模式。所有其他自定義模式均適用於客戶端。所有模式都具有相同的表設置。Laravel 4,從多個postgresql模式中檢索數據

但是對於某些客戶端,必須檢索數據多個模式。這可能與L4?或者我必須編寫自定義查詢?

這些都是我爲DB連接

'pgsql' => array(
     'driver' => 'pgsql', 
     'host'  => 'localhost', 
     'database' => 'postgres', 
     'username' => 'postgres', 
     'password' => 'root', 
     'charset' => 'utf8', 
     'prefix' => '', 
     'schema' => 'public, client1, client2', 
    ), 

設置,但是當我預成型查詢:

$users = Users::all() 
**OR** 
$users = DB::select(DB::raw('SELECT * FROM client1.users, client2.users')); 

我只能從公共檢索用戶。 我錯過了什麼,或者Laravel不可能這麼做嗎?

在此先感謝

回答

1

它與Laravel相當容易。

在你的配置:

... 

'pgsql2' => array(
    'driver' => 'pgsql', 
    'host'  => 'localhost', 
    'database' => 'postgres', 
    'username' => 'postgres', 
    'password' => 'root', 
    'charset' => 'utf8', 
    'prefix' => '', 
    'schema' => 'client1', 
), 

... 

在你的模型:

// Define your second db connection 
protected $connection = 'pgsql2'; 
// Define your table 
protected $table = 'users'; 

如果沒有測試過這一點,所以如果不工作:

// Define your table 
protected $table 'client1.users'; 

在模型。

+0

感謝你的答案,但我希望能在一個查詢中從多個模式獲取記錄。但經過一番調查,我發現這是不可能的。或者我錯了? –

+0

您應該能夠以與單個模式相同的方式定義模型上的關係(我已經完成了這一工作並且它可行),並使用Eloquent查詢您的數據。流暢的查詢生成器應該以相同的方式工作,只要確保您的表格是按照上面顯示的那樣定義的。 – adam

1

您不需要在您的配置中指定其他架構,將其保留爲public

您的查詢是錯誤的 - 就是這樣。這應該是:

SELECT * FROM client1.users UNION ALL SELECT * FROM client2.users 

此查詢將從兩個表中選擇一切。您可以從UNION ALL中儘可能多地選擇表格。

您可能需要確定哪些用戶在哪個模式,所以只要在查詢中增加一個標識符(變量):

SELECT 1 AS s, * FROM client1.users 
UNION ALL 
SELECT 2 AS s, * FROM client2.users 
UNION ALL 
SELECT 3 AS s, * FROM client3.users 

輸出應該是這樣的:

| s | id | name | 
|---|----|--------| 
| 1 | 1 | John | 
| 1 | 2 | Lucy | 
| 2 | 1 | Robert | 
| 3 | 1 | Kelly | 
| 3 | 2 | Sam |