首页 > 解决方案 > 在 Yii2 hasMany 关系中使用 viaTable 应该如何包含列名?

问题描述

在我的示例中,我有模型User。AUser有许多组织。一个Organisation有很多用户。

为了清楚起见,我在此示例中使用了一些稍微不寻常的列名。

user有主键列user_aorganisation有主键列organisation_a

我们还有一个名为的连接表user_organisation,其中包含一个主键(此处不相关)以及user_borganisation_b

如何使用getOrganisationsahasMany和 a在 Yii2 中创建用户与其组织的关系viaTable

public function getOrganisations()
{
    return $this->hasMany(Organisation::className(), ['column_a' => 'column_b'])
    ->viaTable('user_organisation', ['column_c' => 'column_d']);
} 

我应该用什么替换column_a, column_b, column_c, column_d

标签: yii2

解决方案


当您在 Yii2 中创建更简单的关系时,您可能会从以下内容开始。

在这里,我们有一个具有单个组织的用户。表user有列organisation_borganisation表有列organisation_a

在我们的关系中,我们使用组织列定义这些列,organisation_a然后是用户表列organisation_b

public function getOrganisation()
{
    return $this->hasOne(Organisation::className(), ['organisation_a' => 'organisation_b']);
}

在我们有hasMany关系的地方,我们定义列的方式会发生一些变化。我们还需要考虑链接表。

我们的hasMany关系定义部分现在包含链接表user_organisation与表的关联方式organisation。第一列应定义organisation表中存在的内容。对我们来说就是organisation_a。第二列是本user_organisation组织表中的相关列。对我们来说就是organisation_b

我们关系的新viaTable部分现在将表链接individual到链接表user_organisation。第一列应定义user_organisation表中存在的内容。对我们来说就是user_b。第二列是表中的相关列user。对我们来说user_b

public function getOrganisations()
{
    return $this->hasMany(Organisation::className(), ['organisation_a' => 'organisation_b'])
        ->viaTable('user_organisation', ['user_b' => 'user_a']);
} 

在更标准的示例中,您可能会使用很多id列名来代替我们在此处使用的不太标准的示例。


推荐阅读