说我有四个表:
组可以有任意数量的组,activities
并且活动可以groups
通过中间表属于任何数量的group_activities
组,而用户通过属于一个组users.group_id
。我想正确地建模users
和之间的关系,activities
以便用户可以进行任何一项活动,但前提是该用户所属的组与该活动具有关系。
HasOneThrough在这里似乎不起作用,因为与用户关联的组具有多个活动。HasManyThrough不起作用,因为用户只能拥有一个。
我想正确地建立这种关系的模型,以便可以通过Nova关系字段自动选择它,但是我一直在努力弄清楚我将如何做。我的第一个想法是与一组子查询建立一个HasOneThrough关系,但我无法拼凑出从哪里开始。
我将如何做到这一点,或者反过来,是否可以通过Eloquent的自动关系系统实现呢?
为确保我们对您的人际关系持相同看法:
组与活动之间的关系是多对多关系(Larvel Documentation)。
该group_activities
表是数据透视表。
用户和组之间的关系是一对多关系一对多关系-Larvel文档,以及它的逆向关系一对多(Inverse)-Larvel文档。
实际回答您的问题:
如果要使用用户到其活动的快捷方式,则“遍历众多”是正确的方法。如果一个组可以具有任意多个活动,并且用户属于一个组,则该用户将通过该组与这些任意多个活动相关联,因此具有“多次通过”。请注意,尽管这并不是真正的独立关系,它只是一个便捷的快捷方式。
如果您不想直接将用户与单个活动相关联,则需要通过用户与活动之间的单独的一对多关系来实现。
我不确定我是否正确解释了您的问题,因此以下内容只是一个假设,但是您是否要确保用户只能与也与用户组相关联的活动相关联?因此,要按组限制可能的活动?在这种情况下,您只需要检查所选活动是否在与用户组关联的活动中:
像这样建立关系:
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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句