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

时间:2019-11-07 18:07:05

标签: php laravel eloquent laravel-nova

说我有四个表:

  • 用户
  • 活动
  • group_activities

其中一个组可以具有任意数量的activities,并且活动可以通过其中间表groups属于任意数量的group_activities,而用户通过{{ 1}}。我想正确地模拟users.group_idusers之间的关系,以便用户可以进行任何 one 活动,但前提是该用户所属的组与该活动有关系活动。

HasOneThrough在这里似乎不起作用,因为与用户关联的组具有多个活动。由于用户只能拥有一个,因此HasManyThrough无法正常工作。

我想正确地建立这种关系的模型,以便可以通过Nova关系字段自动选择它,但是我一直在努力弄清楚我将如何做。我的第一个念头是与一组子查询建立的HasOneThrough关系,但我无法拼凑从哪里开始。

我该怎么办?或者相反,完全可以通过Eloquent的自动关系系统吗?

1 个答案:

答案 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);
}
相关问题