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

Laravel/Eloquent - Modeling a HasOne relationship via a BelongsToMany relationship

假设我有四个 tables:

其中一个组可以有任意数量的 activities 并且 activity 可以属于任意数量的 groups 通过它们的中间 table group_activities,并且用户通过 users.group_id 属于一个组。我想正确建模 usersactivities 之间的关系,以便用户可以拥有任何 one activity,但前提是该用户所在的组属于 与 activity.

有关系

HasOneThrough 在这里似乎不起作用,因为与用户相关的组有多项活动。 HasManyThrough 不起作用,因为用户只能拥有一个。

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

我该怎么做,或者相反,是否可以通过 Eloquent 的自动关系系统实现?

为确保我们对你们的关系有相同的看法:

组和活动之间的关系是多对多关系 (Many To Many - Larvel Documentation)。

group_activities table 是支点 table.

用户和组之间的关系是一对多关系One To Many - Larvel Documentation and the inverse of it One To Many (Inverse) - Larvel Documentation

实际回答你的问题:

如果您想使用从用户到他们的活动的快捷方式,Has Many Through 是正确的方法。如果一个组可以有任意多个活动,并且一个用户属于一个组,则该用户将通过该组关联到这些任意多个活动 - 因此有很多通过。请注意,这并不是真正独立的关系,它只是一个方便的快捷方式。

如果您不想将用户与单个 Activity 直接相关联,您需要通过用户和活动之间的单独的一对多关系来实现。

我不完全确定我是否正确解释了你的问题,所以以下只是一个假设,但你想确保用户只能关联到一个 activity 那也与用户组?所以要按组限制可能的活动?如果是这种情况,您只需检查所选 activity 是否在与用户组关联的活动中:

你的人际关系是这样的:

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);
}