我使用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:
任何提示如何通过它?或者如何使用其他连接方式获取数据。
答案 0 :(得分:1)
您的RDBMS可能不支持从不同数据库加入表(例如PostgreSQL)。但是如果支持(MSSQL,MySQL),那么表名应该以数据库名称为前缀(如果需要,还应该使用模式)。您可以使用tableName()
函数中的{{%TableName}}
syntax在Yii2中实现此目的。
public static function tableName()
{
return '{{%table_name}}';
}
但如果它们位于不同的服务器上,请小心加入来自不同数据库的表 - 这可能非常慢。
如果您只想获取相关数据(WHERE
中未使用已加入的表格),请使用with()
代替joinWith()
。这将作为单独的查询与IN
语句一起执行。在大多数情况下,这种方式具有更好的性能,并且不同来源(甚至不同的DBMS)也没有问题。
->with('nextTab', 'nextTab.nextTab1', 'nextTab.nextTab1.nextTab2')
答案 1 :(得分:0)
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;
}
}
祝你好运!