ii .活动记录相关记录来自其他数据库


yii active record related records from another databases

我在一个模块/模型文件夹中有一个名为SuperModel的模型。并且相关的ChildModel1, ChildModel2在另一个模块/模型文件夹中。

来自database1的SuperModel数据记录必须包含相关的记录Child1和Child2,它们被放置在另一个数据库中。

是否有办法通过yii ActiveRecord关系机制同时从几个数据库中获得使用关系的记录?像这样:

$super_record = SuperRecordModel::model()->with( 
    'RecordFromDB_A',
    'RecordFromDB_B' 
)->findAll( $criteria );

或者我需要使用这样的东西:

// From first DB...
$super_record = SuperRecordModel::model()->findAll();
// Separately from another DB A...
$super_record->ChildsA = ChildsAModel::model()->findAll(
    't.parent_id = :super_record_id'
);
// Separately from another DB B...
$super_record->ChildsB = ChildsBModel::model()->findAll( 
    't.parent_id = :super_record_id'
);

怎么是对的?

更新:我不能在多数据库选择操作中使用yii活动记录关系…我如何在活动记录方法中的数据库之间切换?例子:

$catalogs = $this->findAll();
// Set new database connection for this context..
// $this->setDbConnection( yii::app()->db2 );
foreach( $catalogs as &$catalog ) {
    $catalog->service = Services::model()->find(
        't.catalog_id = :catalog_id', ... );
    // this gives error: table services cannot be found in the database
}

好的,我研究了文档,注释,现在这个问题解决了。

数据库中的表不能直接引用另一个数据库中的表这意味着关系不跨越数据库边界。

http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii/

解决方案。让我们为将来将要使用的所有db连接编写设置参数。例子:

'modules' => array(
    'module_name' => array(
        'db1' => array(
            'class' => 'CDbConnection',
            'connectionString' => 'mysql:host=...;dbname=db1',
            'username' => 'user',
            'password' => 'password',
            'charset' => 'utf8',
        ),
        'db2' => array(
            'class' => 'CDbConnection',
            'connectionString' => 'mysql:host=...;dbname=db2',
            'username' => 'user',
            'password' => 'password',
            'charset' => 'utf8',
        ),
    )
),
...

在模块init()方法或另一个逻辑入口点,你需要创建CDbConnection类的对象,它是这样的:

$db1_connection = Yii::createComponent( Yii::app()->controller->module->db1 );
$db2_connection = Yii::createComponent( Yii::app()->controller->module->db2 );

然后使用CDbConnection::createCommand从数据库中获取所需的数据。

// Records from db1.
$parent_records = $db1_connection
    ->createCommand('SELECT * FROM parent_table')
    ->queryAll();
// Records from db2 as childs of parent record.
foreach( $parent_records as &$parent_record ) {
    $parent_record['childs'] = $db2_connection
        ->createCommand('SELECT * FROM child_table WHERE parent_id = :parent_id')
        ->bindParam(':parent_id', $parent_record['parent_id'])
        ->queryAll();
}