【问题标题】:Laravel many to many with a pivot relationship.Laravel 多对多具有枢轴关系。
【发布时间】:2018-04-13 15:18:55
【问题描述】:

用户

  • uid

提供者

  • pid

分辨率

  • 摆脱

ProviderResolution

  • 骄傲
  • pid
  • 摆脱
  • 有效

ProviderResolutionUser

  • 骄傲
  • uid

class Provider extends Model {  

    public function resolutions()
    {
        return $this->belongsToMany('App\Models\Resolution')->withPivot('active')->withTimestamps();
    }

}

class Resolution extends Model {

    public function providers()
    {
       return $this->belongsToMany('App\Models\Provider')->withPivot('active')->withTimestamps();
    }
}

 class User extends Model 
 {

 }

尝试与此建立 Eloquent 关系。

我试图弄清楚如何让用户适应这个模型。似乎它应该属于BelongsToMany。我需要创建一个代表枢轴的类吗?

那么从用户的情况下,我将如何查询列表分辨率?

【问题讨论】:

  • 你不能只创建一个表ProviderResolutionUser pid rid uid active吗?
  • 其实没有。如果用户变得不活动,我需要能够为用户禁用 ProviderResolution。我还需要向用户提供它们的列表。

标签: php laravel eloquent


【解决方案1】:

您没有问,但我个人认为让每个表的主键为“id”要容易得多。此外,对于 ProviderResolution,除非您有特定情况,否则您根本不需要(也不应该使用)“prid”。只需“pid”、“rid”和“active”就足够了。 'pid' 和 'rid' 自己创建复合主键。如果您添加另一个键('prid'),那么将有一个三键组合,从技术上讲,这将使您能够与其他两个主键重复。呸。示例:PRID:1、PID:1、RID:1,然后是 PRID:2、PID:1、RID:1。现在您有重复项,但由于 PRID 键,您的记录在技术上仍然是唯一的。但是,也许您出于某种原因想要这样?

对于答案,我假设您使用的是 Laravel 5.4+。 所以首先,你不需要一个用于枢轴的类。其次,您当前正试图通过创建一个名为“provider_resolution_user”的表来创建用户与 Provider 和 Resolution 之间的现有数据透视表之间的关系。如果您想查询用户的分辨率,只需使用关系方法即可访问数据透视表和相关模型/表上的属性。

首先,在两个类中设置“hasMany”关系:Users 和 Resolutions(Providers 已经与 Resolutions 有关系,因此如果您想查看相关的 Provider,可以使用该关系。)然后您需要一个支点名为“resolution_user”的表。将 'uid' 和 'rid' 放在表中。将对应的外键字段与它们的父表建立关系。

现在您可以像这样直接访问关系:

$user->resolutions->rid(或任何你想要的属性)

前面的示例假设您已经创建了一种将记录插入数据透视表 (resolution_user) 的方法,将用户和分辨率关联在一起。

如果您想访问数据透视表上的属性之一,'pivot' 会创建一个具有其自身属性(来自表)的对象实例。你可以这样访问它:

$user->resolutions->pivot->active;

当然,这些方法是可链接的,因此如果您只想查看活动的分辨率,还可以添加 ->where 语句。

希望能有所帮助,不要太混乱。如果需要,我很乐意澄清任何问题。

编辑答案:

因为您要做的是禁用 provider_resolution 表中的一行并将其反映在正确的用户上,然后只需在 User 模型和 Resolution 模型中创建一个关系。因此,当您禁用 provider_resolution(pid、rid、active)中的一行时,您可以通过使用分辨率和用户之间的反比关系来查找要更新的适当用户。这应该为您提供分配给该特定分辨率/提供商组合的用户。如果由于某种原因您确实需要基于两个的独特组合来查找用户:分辨率和提供者,那么我们可能需要讨论多态关系。告诉我。

【讨论】:

  • 谢谢!第一的。我的表确实有id 作为增量。我在这里更改了它以帮助澄清事情。其次,prid 与 User 表有关系。 pidrid 具有唯一约束,因此它们不应有任何重复。我不确定我是否理解你想说的。我希望能够禁用 ProviderResolution 行,然后将其反映在用户上。我不明白你们的关系是如何做到的。您的User->Resolution->pivot->active 将访问resolution_user 中的活动字段,对吗?不是 ProviderResolution 之一。
  • 我想我现在很清楚了。您最初的问题是“从用户的情况来看,我将如何查询 [of] 决议列表?”这与禁用 provider_resolution 中的行和反映用户的行为有点不同。但是,我仍然要说,您可以简单地将用户与摆脱关联,并使用分辨率和用户之间的反比关系来识别禁用分辨率/提供程序行的用户。您不需要将用户与 resolution_provider 表相关联,因为找到与分辨率直接相关的用户(在 resolution_provider 表中)就可以了。
  • 是的,这是有道理的。让我试试看。
  • 祝你好运先生,让我知道进展如何@RyanKnopp
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2019-08-20
  • 2016-07-08
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
相关资源
最近更新 更多