Laravel/Eloquent - 通过 BelongsToMany 关系建模 HasOne 关系
Laravel/Eloquent - Modeling a HasOne relationship via a BelongsToMany relationship
假设我有四个 tables:
- 用户
- 组
- 活动
- group_activities
其中一个组可以有任意数量的 activities
并且 activity 可以属于任意数量的 groups
通过它们的中间 table group_activities
,并且用户通过 users.group_id
属于一个组。我想正确建模 users
和 activities
之间的关系,以便用户可以拥有任何 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);
}
假设我有四个 tables:
- 用户
- 组
- 活动
- group_activities
其中一个组可以有任意数量的 activities
并且 activity 可以属于任意数量的 groups
通过它们的中间 table group_activities
,并且用户通过 users.group_id
属于一个组。我想正确建模 users
和 activities
之间的关系,以便用户可以拥有任何 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);
}