Laravel有许多人与枢轴关系。

时间:2018-04-12 23:43:24

标签: php laravel eloquent

用户

  • UID

提供商

  • PID

解决

  • 远离

ProviderResolution

  • PRID
  • PID
  • 远离
  • 活性

ProviderResolutionUser

  • PRID
  • 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 
 {

 }

尝试与此建立一个雄辩的关系。

我正在试图弄清楚如何让用户适应这个模型。看起来它似乎属于ToMany。我是否需要创建一个代表数据透视的类?

然后从用户的情况如何查询列表解析?

1 个答案:

答案 0 :(得分: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'关系:用户和解决方案(提供商已经与决议有关系,因此如果您想查看相关的提供商,您可以使用该关系。)然后您需要一个支点表名为'resolution_user'。将'uid'和'rid'放在表格中。将与相应外键字段的关系设置为其父表。

现在您可以直接访问该关系,如:

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

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

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

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

当然,这些方法是可链接的,所以如果你只是想看到有效的分辨率,你也可以添加一个 - > where语句。

希望有所帮助并且不会太混乱。如果需要,我很乐意澄清任何要点。

编辑回答:

因为您要做的是禁用provider_resolution表中的行并使其反映在正确的用户上,然后只在User模型和Resolution模型中创建关系。因此,当您在provider_resolution(pid,rid,active)中禁用行时,您可以使用分辨率和用户之间的反向关系来查找要更新的相应用户。这应该为您提供分配给该特定分辨率/提供商组合的用户。如果出于某种原因,您确实需要根据TWO:resolution AND provider的唯一组合找到用户,那么我们可能需要讨论多态关系。让我知道。