2016-07-27 118 views
1

我使用yii2來構建一個需要連接某些表的應用程序。我可以簡單地加入他們並搜索相關領域的數據。我加入這樣的連接做>在不同的數據庫中搜索相關數據

public function getNextTab() 
{ 
return $this->hasOne(NextTab::className(),['id' =>'id_nexttab']); 
} 

,並使用像這樣的搜索模型索要數據 - >

->where ('id'='ok') -> 
->joinWith('nextTab') 
->joinWith('nextTab.nextTab1') 
->joinWith('nextTab.nextTab1.nextTab2'); 

我的問題是,當我嘗試從表做到這點不同的數據庫查詢是給我錯誤像

SQLSTATE[42S02]: Base table or view not found: 

任何提示如何通過它?或者如何做其他連接方式來獲得數據。

回答

1

您的RDBMS可能不支持連接來自不同數據庫的表(例如,PostgreSQL)。但是,如果支持(MSSQL,MySQL),那麼表名應該以數據庫名稱作爲前綴(如果需要,還可以使用模式)。您可以使用{{%TableName}} syntax中的函數在Yii2中實現此功能。

public static function tableName() 
{ 
    return '{{%table_name}}'; 
} 

但是,如果連接來自不同數據庫的表(如果它們位於不同的服務器上),請小心 - 這可能會非常緩慢。

如果您只想獲取相關數據(連接的表格不在WHERE中使用),請使用with()而不是joinWith()。這將作爲單獨的查詢與IN聲明執行。在大多數情況下,這種方式具有更好的性能,並且不同來源(甚至不同的DBMS)都沒有問題。

->with('nextTab', 'nextTab.nextTab1', 'nextTab.nextTab1.nextTab2') 
+0

tx。它現在有效。與連接。我剛剛添加到每個模型函數'public static function tableName() { return'db1.Tab'; }'和'public static function tableName() { return'db2。TAB2' ; }'爲下表,它的工作原理。 – Alexei

+0

@亞歷井好。樂意效勞。請用您的最終代碼更新答案,並標記爲已解決。這可能會幫助別人。不要忘記upvote ;-) – oakymax

0
  1. 在應用程序的配置中配置第二個數據庫組件。
  2. 覆蓋ActiveRecord模型中的getDB()函數以返回第二個數據庫組件。

這會將您的模型附加到輔助數據庫,並允許您從輔助數據庫中的表進行查詢。

配置示例:

'components' => [ 
    'db2' => [ 
     'class' => 'yii\db\Connection', 
     'dsn' => 'mysql:host=localhost;dbname=db2', 
     'username' => 'hello', 
     'password' => 'world', 
    ], 
], 

getDB()功能覆蓋樣本:

class Tab extends ActiveRecord 
{ 
    public static function getDb() 
    { 
     // use the "db2" component 
     return \Yii::$app->db2; 
    } 
} 

祝您好運!

+0

@Abdula我有過這樣的連接,因爲在我的項目,我同時使用DB爲不同的部分,但是當我試圖取代「getBD()」我得到不同的錯誤:「該表不存在:標籤'。所以這樣我就不再和第一個主要模型有任何關係。這是我失蹤的東西嗎? – Alexei

+0

'Tab'就是一個例子。您的實際課程需要基於您的模式。爲了更好地理解你的場景,我需要看你的模式。你能分享一下嗎? –