2014-11-06 36 views
0

我正在使用Yii框架2.0并拥有两个数据库表(A和B)。它是一个关系数据库1:n。 A只有一个B,但B有很多A.我的数据库看起来与此类似。Yii Framework 2.0关系数据库活动记录

A table: 
id = 1, name = yes 
id = 2, name = no 
id = 3, name = ok 
id = 4, name = good 

B table: 
id = 1, a_id = 1 
id = 2, a_id = 1 
id = 3, a_id = 2 
id = 4, a_id = 2 
id = 5, a_id = 3 

以我控制器I使用以下代码来检索和A的所有数据B:我使用下面的for-each呼应的所有数据

$bModel = B::find()->all(); 

以我图。

foreach($bModel as $b) { 
    echo $b->a->name . ' - ' $b->id. '<br>; 
} 

结果是:

yes - 1 
yes - 2 
no - 3 
no - 4 

我要的是:

yes - 1 
     2 

no - 3 
     4 

我要合并的A_ID和显示所有B的每个合并A_ID的ID。我不想使用正常的方式,先获取所有a的id,然后使用for-each来循环每个a的id,然后通过a的id来逐个查询b。我如何用Yii framework 2.0来处理第二个结果?

回答

1

您可以使用joinWith()方法来加载相关模型。 Eager Loading会使用一个查询获取所有B关系,以便每次在循环中都不查询数据库。首先,确保你已经在模型中的定义这种关系:共同使用joinWith()方法

/** 
* @return \yii\db\ActiveQuery 
*/ 
public function getBs() 
{ 
    return $this->hasMany(A::className(), ['a_id' => 'id']); 
} 

接下来,查询所有的记录:

foreach (A::find()->joinWith('bs')->all() as $a){ 
    echo $a->name."\n<br />\n"; 
    foreach ($a->bs as $relatedB){ 
     echo $relatedB->name.' - '.$relatedB->id."\n<br />\n"; 
    } 
    echo "\n<br />\n"; 
} 

joinWith()默认为预先加载使用LEFT JOIN加入模型。如果您运行此查询并启用数据库日志记录,则只应该看到一个查询来获取A模型和一个查询来获取B模型。

更多关于与关系加盟:http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#joining-with-relations

+0

如果有ID = 3的一个表,但是有在B表NO A_ID = 3,我想只查询A记录其中B有它的A_ID作为外键。我怎样才能做到这一点? – 2014-11-12 16:33:56

+0

我认为你所描述的是一个内部联接。在这种情况下,尝试将foreach循环中的代码从'A :: find() - > joinWith('bs') - > all()'更改为'A :: find() - > innerJoinWith('bs') - > all()' – Caleb 2014-11-12 16:45:50

+0

它很棒。感谢那。不幸的是我也需要使用分页控件。所以我使用了后面的代码:A :: find() - > innerJoinWith('bs');我的分页代码如下所示:$ pagination = new Pagination([ 'defaultPageSize'=> 2, 'totalCount'=> A-> count(), ]); $ allA = A-> offset($ pagination-> offset) - > limit($ pagination-> limit) - > all(); – 2014-11-13 09:05:37