2014-07-10 62 views
0

我在一个模块/模型文件夹中有模型,名为SuperModel。并在另一个模块/模型文件夹中关联ChildModel1,ChildModel2。yii来自另一个数据库的活动记录相关记录

来自database1的超级模型数据记录必须包含放置在其他数据库中的相关记录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 
} 
+1

您是否测试过两种方法,看它是否有效?我没有yii设置来测试。我在yii中发现了关于多重数据库的支持.... http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii/ – xJoshWalker

+0

谢谢@joshjwalker,我读过这个文档,现在了解我需要实现代码的第二个变体...如何在活动记录方法内的数据库之间切换? – itnelo

+0

在您的“服务”ActiveRecord模型中,您需要定义备用数据库连接,类似于我发送的文章的“GetDbConnection()覆盖”部分。这将是我最好的猜测 – xJoshWalker

回答

0

Okey,我探讨了文档,评论和现在这个问题已经解决。

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

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

解决方案。让我们为将来使用模块的所有数据库连接写入设置参数。例如:

'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(); 
} 
+1

请注意,Yii 2.0支持不同数据库中的表之间的关系。 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#cross-database-relations – MrD

相关问题