2016-07-27 1 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

Объединение таблиц из разных баз данных может не поддерживаться вашей РСУБД (например, PostgreSQL). Но если поддерживается (MSSQL, MySQL), тогда имена таблиц должны иметь префикс имени базы данных (и схемы при необходимости). Вы можете достичь этого в Yii2, используя {{%TableName}} syntax в функции tableName().

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

Но будьте осторожны с присоединением таблиц из разных баз данных, если они расположены на разных серверах - это может быть очень медленным.

Если вы просто хотите получить связанные данные (объединенные таблицы не используются в WHERE), то используйте with() вместо joinWith(). Это будет выполняться как отдельный запрос с оператором IN. В большинстве случаев этот способ имеет лучшую производительность и никаких проблем с разными источниками (и даже с разными СУБД).

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

tx. Он работает сейчас. с соединениями. Я просто добавил к каждой функции модели «public static function tableName() { return 'db1.Tab'; } 'и' public static function tableName() { return 'db2.Таб2' ; } 'для следующих таблиц и работает. – Alexei

+0

@Alexei хорошо. Рад помочь. Пожалуйста, обновите ответ своим окончательным кодом и отметьте как разрешенный. Это может помочь кому-то другому. И не забудьте поднять ;-) – oakymax

0
  1. Настройте свой второй компонент базы данных в конфигурации приложения.
  2. Переверните функцию getDB() в вашей модели ActiveRecord, чтобы вернуть второй компонент БД.

Это добавит вашу модель в вторичную БД и позволит вам запрашивать из таблицы во вторичной БД.

Config образца:

'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; 
    } 
} 

Good Luck!

+0

@Abdula У меня была связь, как это потому, что в моем проекте я использую обе БД для разных частей, но когда я пытаюсь заменил «getBD()» я получаю другую ошибку: «Таблица не существует: Tab». Таким образом, у меня просто нет связи с первой основной моделью. Это что-то, чего мне не хватает? – Alexei

+0

'Tab' был примером. Ваш фактический класс должен основываться на вашей схеме. Чтобы лучше понять ваш сценарий, мне нужно будет увидеть вашу схему. Можете ли вы поделиться этим? –

Смежные вопросы