繁体   English   中英

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

[英]Yii Framework 2.0 Relational Database Active Record

我正在使用Yii Framework 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();

在我看来,我使用以下for-each来回显所有数据。

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()方法来快速加载相关模型。 急切加载将通过一个查询获取所有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-with-relations

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM