在我的示例中,我有模型User
。 User
有许多组织。 Organisation
有许多用户。
为清楚起见,在此示例中,我使用了一些稍微不寻常的列名。
user
表具有主键列user_a
organisation
表具有主键列organisation_a
我们还有一个名为user_organisation
的联接表,其中包含一个主键(此处不相关)以及user_b
和organisation_b
列。
如何使用getOrganisations
,hasMany
和viaTable
在Yii2中创建用户与其组织之间的关系?
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
替换为什么?
答案 0 :(得分:0)
在Yii2中创建更简单的关系时,您可能会从以下内容开始。
在这里,我们有一个拥有单个组织的用户。 user
表具有列organisation_b
,而organisation
表具有列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
列名来代替此处使用的较不标准的示例。