假设我有四个表:
- 用户
- 组
- 活动
- 组活动
其中,一个组可以具有任意数量的activities
,一个活动可以通过其中间表group_activities
属于任意数量的groups
,用户通过users.group_id
属于一个组。我想正确地为users
和activities
之间的关系建模,以便用户可以拥有任何一个活动,但前提是该用户所属的组与该活动有关系。
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);
}