Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2 多数据库连接和Yii 2.0_Yii2 - Fatal编程技术网

Yii2 多数据库连接和Yii 2.0

Yii2 多数据库连接和Yii 2.0,yii2,Yii2,我有两个数据库,每个数据库都有相同的表和相同的字段,但如何在2.0中同时从所有两个数据库中获取所有记录?首先,您需要如下配置数据库: return [ 'components' => [ 'db1' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,.

我有两个数据库,每个数据库都有相同的表和相同的字段,但如何在2.0中同时从所有两个数据库中获取所有记录?

首先,您需要如下配置数据库:

return [
'components' => [
    'db1' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,...
        'username' => 'db1username',
        'password' => 'db1password',
    ],
    'db2' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db2name', // Maybe other DBMS such as psql (PostgreSQL),...
        'username' => 'db2username',
        'password' => 'db2password',
    ],
],
];
然后你可以简单地:

// To get from db1
Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()

// To get from db2
Yii::$app->db2->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
如果您使用的是活动记录模型,则可以在模型中定义:

public static function getDb() {
    return Yii::$app->db1;
}

//Or db2
public static function getDb() {
    return Yii::$app->db2;
}
然后:

如果在
getDb()
方法中设置了
db1
,则结果将从
db1
中获取,依此类推

ModelName::find()->select('*')->all();
我只想补充一点: 我按照提供的答案进行操作,但仍然出现了一个错误: “未知组件ID:db”

经过一些测试,我发现:只有在与db建立连接之后,才会调用函数getDB。因此,您不能删除或重命名配置文件中的“db”。相反,您需要让对“db”的调用正常进行,然后重写它

(对我而言)解决方案如下:

'db' => require(__DIR__ . '/db.php'),
'db2' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=name',
    'username' => 'user',
    'password' => 'password',
    'charset' => 'utf8',
    'on afterOpen' => function ($event) {
        $event->sender->createCommand("SET time_zone = '+00:00'")->execute();
    },
],
class LodgeActiveRecord extends \yii\db\ActiveRecord
{

public static function getDb()
{
    $lodgedb = Yii::$app->params['lodgedb'];
    if(array_key_exists( $lodgedb, Yii::$app->params['dbs'])) {
        return Yii::$app->params['dbs'][ $lodgedb ];
    }
    $connection = new \yii\db\Connection([
        'dsn' => 'mysql:host=localhost;dbname=' . $lodgedb,
        'username' => Yii::$app->params['dbuser'],
        'password' => Yii::$app->params['dbpasswd'],
        'charset' => 'utf8',
    ]);
    $connection->open(); // not sure if this is necessary at this point
    Yii::$app->params['dbs'][ $lodgedb ] = $connection;
    return $connection;
}
config/web.php
中,在
db
下面添加第二个数据库配置,如下所示:

'db' => require(__DIR__ . '/db.php'),
'db2' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=name',
    'username' => 'user',
    'password' => 'password',
    'charset' => 'utf8',
    'on afterOpen' => function ($event) {
        $event->sender->createCommand("SET time_zone = '+00:00'")->execute();
    },
],
class LodgeActiveRecord extends \yii\db\ActiveRecord
{

public static function getDb()
{
    $lodgedb = Yii::$app->params['lodgedb'];
    if(array_key_exists( $lodgedb, Yii::$app->params['dbs'])) {
        return Yii::$app->params['dbs'][ $lodgedb ];
    }
    $connection = new \yii\db\Connection([
        'dsn' => 'mysql:host=localhost;dbname=' . $lodgedb,
        'username' => Yii::$app->params['dbuser'],
        'password' => Yii::$app->params['dbpasswd'],
        'charset' => 'utf8',
    ]);
    $connection->open(); // not sure if this is necessary at this point
    Yii::$app->params['dbs'][ $lodgedb ] = $connection;
    return $connection;
}
不要重命名
db
。找不到数据库将导致错误。您可以随意命名db2

现在在模型中,添加以下代码:

class ModelNameHere extends \yii\db\ActiveRecord {

   // add the function below:
   public static function getDb() {
       return Yii::$app->get('db2'); // second database
   }
这将覆盖默认的
db
配置

我希望这能帮助别人

注意:您可以将
db2
的配置包含在另一个文件中,但不能将其包含在
db.php
文件中(显然)。相反,创建一个名为
db2.php
的文件,并像调用
db
一样调用它:

'db' => require(__DIR__ . '/db.php'),    
'db2' => require(__DIR__ . '/db2.php'),

谢谢

我们的情况稍微复杂一些,我们有一个“父”数据库,它有一个表,其中包含一个或多个“子”数据库的名称。 这是因为Yii项目是为每个客户机实例化的,子数据库的数量取决于客户机,而且数据库名称是任意的(尽管遵循一种模式)

因此,我们覆盖
\yii\db\ActiveRecord
详情如下:

'db' => require(__DIR__ . '/db.php'),
'db2' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=name',
    'username' => 'user',
    'password' => 'password',
    'charset' => 'utf8',
    'on afterOpen' => function ($event) {
        $event->sender->createCommand("SET time_zone = '+00:00'")->execute();
    },
],
class LodgeActiveRecord extends \yii\db\ActiveRecord
{

public static function getDb()
{
    $lodgedb = Yii::$app->params['lodgedb'];
    if(array_key_exists( $lodgedb, Yii::$app->params['dbs'])) {
        return Yii::$app->params['dbs'][ $lodgedb ];
    }
    $connection = new \yii\db\Connection([
        'dsn' => 'mysql:host=localhost;dbname=' . $lodgedb,
        'username' => Yii::$app->params['dbuser'],
        'password' => Yii::$app->params['dbpasswd'],
        'charset' => 'utf8',
    ]);
    $connection->open(); // not sure if this is necessary at this point
    Yii::$app->params['dbs'][ $lodgedb ] = $connection;
    return $connection;
}
}

在调用任何数据库函数之前,首先将
Yii::$app->params['lodgedb']
设置为所需数据库的名称:

Yii::$app->params['lodgedb'] = $lodge->dbname; // used by LodgeActiveRecord
模型类不会更改,除非它们从LodgeActiveRecord扩展:


class BookingRooms extends\app\models\LodgeActivieRecord
如果您使用生成模型类,则有一个
'modelDb'
属性,您可以将其设置为使用除
'db'
之外的数据库组件。提前感谢您的精彩回答。它非常有用。我使用您的代码时出错。这并不是完全错误,但我认为你错过了一些东西。您在返回[Great One!!竖起大拇指]后遗漏了“'class'=>'yii\db\Connection'”。我是唯一一个在ActiveRecord中有此方法是静态的并且不能用非静态方法覆盖它的人吗?应该是
公共静态函数getDb()
使用static,因为它是重写静态方法。我重命名了“db”,它工作了。除此之外,你的解决方案也工作了。我尝试过你的解决方案,但我得到了
SQLSTATE[42000]:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]靠近“=”的语法不正确。正在执行的SQL是:SET time_zone='+00:00'
,知道吗?谢谢