2016-07-27 3 views
1

yii2を使用して、いくつかのテーブルを接続する必要がある1つのアプリケーションを構築します。私はそれらに簡単に加わり、関連分野のデータを検索することができます。私は、この>関連するデータを別のデータベースで検索する

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)でサポートされていない可能性があります。しかし、サポートされている場合(MSSQLMySQL)、テーブル名の先頭にデータベース名(必要に応じてスキーマ)を付ける必要があります。 の機能で{{%TableName}} syntaxを使用してYii2でこれを達成できます。

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

しかし、彼らは異なるサーバー上に配置されている場合は、異なるデータベースからテーブルを結合して注意してください - これは非常に遅くなることがあります。

関連するデータを取得したい場合(結合テーブルはWHEREでは使用されません)、joinWith()の代わりにwith()を使用してください。これは別のクエリとしてINステートメントで実行されます。ほとんどの場合、この方法はパフォーマンスが向上し、さまざまなソース(および異なるDBMS)で問題は発生しません。

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

tx。それは今働く。接続します。私はそれぞれのモデル関数 'public static function tableName()を追加しました。 { return' db1.Tab '; } 'public static function tableName() { を返します。Tab2 '; } 'と表示され、動作します。 – Alexei

+0

@Alexei良い。喜んで助けてください。答えを最終的なコードで更新し、解決済みとしてマークしてください。これは他の人を助けるかもしれません。 upvote ;-)を忘れないでください – oakymax

0
  1. アプリケーションの設定で2番目のデータベースコンポーネントを設定します。
  2. ActiveRecordモデルのgetDB()関数をオーバーライドして、2番目のDBコンポーネントを返します。

これは、モデルをセカンダリDBにアタッチし、セカンダリDBのテーブルからクエリできるようにします。

コンフィグサンプル:

'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'が例でした。実際のクラスはスキーマに基づいている必要があります。あなたのシナリオをよりよく理解するためには、自分のスキーマを確認する必要があります。それを分かち合えますか? –

関連する問題