说我有四个表:
其中一个组可以具有任意数量的activities
,并且活动可以通过其中间表groups
属于任意数量的group_activities
,而用户通过{{ 1}}。我想正确地模拟users.group_id
和users
之间的关系,以便用户可以进行任何 one 活动,但前提是该用户所属的组与该活动有关系活动。
HasOneThrough在这里似乎不起作用,因为与用户关联的组具有多个活动。由于用户只能拥有一个,因此HasManyThrough无法正常工作。
我想正确地建立这种关系的模型,以便可以通过Nova关系字段自动选择它,但是我一直在努力弄清楚我将如何做。我的第一个念头是与一组子查询建立的HasOneThrough关系,但我无法拼凑从哪里开始。
我该怎么办?或者相反,完全可以通过Eloquent的自动关系系统吗?
答案 0 :(得分:2)
为确保我们对您的人际关系保持一致:
组与活动之间的关系是多对多关系(Many To Many - Larvel Documentation)。
group_activities
表是数据透视表。
用户和组之间的关系是一对多关系One To Many - Larvel Documentation,与之相反One To Many (Inverse) - Larvel Documentation。
要实际回答您的问题:
如果要使用用户到其活动的快捷方式,则“遍历众多”是正确的方法。如果一个组可以具有任意多个活动,并且一个用户属于一个组,则该用户将通过该组与这些任意多个活动相关联-因此具有多次通过。请注意,尽管这并不是真正的独立关系,它只是便捷的快捷方式。
如果您不想直接将用户与单个活动相关联,则需要通过用户与活动之间的单独的一对多关系来做到这一点。
我不确定我是否正确解释了您的问题,因此以下内容只是一个假设,但是您是否要确保用户只能与也与用户组相关联的活动相关联?那么要按组限制可能的活动?在这种情况下,您只需要检查所选活动是否在与用户组关联的活动中:
建立这样的关系:
class User {
public function activity(){
return $this->belongsTo('App\Activity');
}
public function possibleActivities(){
return $this->hasManyThrough('App\Activity','App\Group');
}
}
您可以检查并关联以下活动:
if( $user->possibleActivities()->contains( $activity ) ){
$user->activity()->associate($activity);
}