Laravel/Eloquent-通过BelongToMany关系建模HasOne关系



假设我有四个表:

  • 用户
  • 活动
  • 组活动

其中,一个组可以具有任意数量的activities,一个活动可以通过其中间表group_activities属于任意数量的groups,用户通过users.group_id属于一个组。我想正确地为usersactivities之间的关系建模,以便用户可以拥有任何一个活动,但前提是该用户所属的组与该活动有关系。

HasOneThrough在这里似乎不起作用,因为与用户相关的组有多个活动。HasManyThrough不起作用,因为用户只能有一个。

我想对这个关系进行适当的建模,这样它就可以通过Nova关系字段自动选择,但我很难弄清楚我该怎么做。我的第一个想法是一个带有一些子查询的HasOneThrough关系,但我不太清楚从哪里开始。

我该如何做到这一点,或者反过来说,这是否可能通过Eloquent的自动关系系统实现?

为了确保我们对您的关系有相同的看法:

组和活动之间的关系是多对多关系(多对多-大型文档(。

group_activities表是数据透视表。

用户和组之间的关系是一对多关系一对多Larvel文档,也是一对多(逆(Larvel文档的逆关系。

要真正回答您的问题:

如果你想使用从用户到他们活动的快捷方式,"多次通过"是正确的方式。如果一个组可以有任意多个活动,并且用户属于一个组,则该用户将通过该组与这些任意多的活动相关联,因此具有多个通过。请注意,这并不是一种真正的独立关系,它只是一种方便的快捷方式。

如果您不想直接将用户与单个"活动"关联,则需要通过用户和"活动"之间单独的一对多关系来实现。

我不完全确定我是否正确解释了你的问题,所以以下只是一个假设,但你想确保用户只能与同样与用户组相关的活动相关联吗?那么,按组限制可能的活动?如果是这种情况,您只需检查所选活动是否在与用户组相关的活动中:

你的关系是这样建立的:

class User {
public function activity(){
return $this->belongsTo('AppActivity');
}
public function possibleActivities(){
return $this->hasManyThrough('AppActivity','AppGroup');
}
}

你可以检查和关联这样的活动:

if( $user->possibleActivities()->contains( $activity ) ){
$user->activity()->associate($activity);
}

最新更新