Yii Framework 2.0关系数据库活动记录


Yii Framework 2.0 Relational Database Active Record

我使用Yii框架2.0,有两个数据库表(A和B)。它是一个关系数据库1:n。A只有一个B,但B有很多A。我的数据库看起来和这个相似。

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

在我的控制器中,我使用以下代码来检索A和B的所有数据:

$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,并显示每个合并的a_id的所有b的id。我不想使用正常的方式,首先获取所有a的id,使用for each循环每个a的id然后通过a的id逐个查询b。如何使用Yii framework 2.0来获得我想要的第二个结果?

您可以使用joinWith()方法急切地加载相关模型。Eager Loading将通过一个查询获取所有B关系,这样您就不会在循环中每次都查询数据库。首先,确保在模型A:中定义了这种关系

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

接下来,使用joinWith()方法一起查询所有记录:

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-具有关系