Laravel / Eloquent-通过BelongsToMany关系为HasOne关系建模

摩根

说我有四个表:

  • 使用者
  • 团体
  • 活动
  • group_activities

组可以有任意数量的组,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章