Php Laravel/雄辩-通过归属关系建模HasOne关系

Php Laravel/雄辩-通过归属关系建模HasOne关系,php,laravel,eloquent,laravel-nova,Php,Laravel,Eloquent,Laravel Nova,假设我有四张桌子: 使用者 团体 活动 小组活动 其中,一个组可以有任意数量的活动,一个活动可以通过其中间表组活动属于任意数量的组,用户通过用户属于一个组。组id。我想正确地建模用户和活动之间的关系,以便用户可以拥有任何一个活动,但前提是该用户所属的组与该活动有关系 HasOneThrough在这里似乎不起作用,因为与用户相关的组有多个活动。HasManyThrough不起作用,因为用户只能有一个 我想对这种关系进行适当的建模,这样就可以通过新星关系字段自动选择它,但我很难弄清楚我将如何做到

假设我有四张桌子:

  • 使用者
  • 团体
  • 活动
  • 小组活动
其中,一个组可以有任意数量的
活动
,一个活动可以通过其中间表
组活动
属于任意数量的
,用户通过
用户属于一个组。组id
。我想正确地建模
用户
活动
之间的关系,以便用户可以拥有任何一个活动,但前提是该用户所属的组与该活动有关系

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

我想对这种关系进行适当的建模,这样就可以通过新星关系字段自动选择它,但我很难弄清楚我将如何做到这一点。我的第一个想法是与一些子查询集建立一个HasOneThrough关系,但我不能很好地拼凑从哪里开始


我该如何做到这一点,或者反过来说,是否可以通过Elounce的自动关系系统实现?

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

组和活动之间的关系是多对多关系()

group\u activities
表是透视表

用户和组之间的关系是一对多的关系,与之相反

实际回答您的问题:

如果要使用从用户到其活动的快捷方式,则“有多个通过”是正确的方法。如果一个组可以有任意多个活动,并且一个用户属于一个组,则该用户将通过该组与这些任意多个活动关联,因此具有多个到。请注意,这实际上并不是一个单独的关系,它只是一个方便的快捷方式

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

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

你的关系是这样建立的:

类用户{
公共职能活动(){
返回$this->belongsTo('App\Activity');
}
公共职能可能性活动(){
返回$this->hasManyThrough('App\Activity','App\Group');
}
}
您可以检查并关联以下活动:

如果($user->possibleActivities()->包含($activity)){
$user->activity()->关联($activity);
}

这在大多数情况下都应该有效。它不会使用Nova的场魔法飞行,但我可以制作psuedofields并在观测者中处理逻辑就足够了。对于任何想用它来处理Laravel Nova的人,就像我一样-我所采取的方法是使用
$user->posabibleActivities()->pull('label','activities.id')
onlyOnForms()
method-然后生成一个自定义字段,其中包含
hidewhenUpdate()
hideWhenCreating()
使用用户上的
getAttribute
方法链接活动及其标签,该方法使用
$User->activity
访问器。