【问题标题】:Foreign key relationships with the same table for two different foreign key columns两个不同外键列与同一张表的外键关系
【发布时间】:2018-06-13 21:26:02
【问题描述】:

假设我有一个 userappointment 表。

用户 - id、姓名、电子邮件、类型(医生/患者)

约会- id、doctor_user_id、patient_user_id

我的用户表数据-

还有我的约会表数据-

我可以通过 appointmentuser 表建立两个 属于 关系

您可以看到我的 appointment 表,我只想存储类型为 doctordoctor_user_iduser > 和 患者patient_user_id。但在这种情况下,我可以将任何用户 ID 添加到 doctor_user_id 字段,无论是 doctor 还是患者,但我只想将用户 ID 添加为医生用户 ID,前提是其类型为医生。

我知道如何使用 两个不同的 表来实现这一点,但我想知道有没有办法通过 单个用户 表来实现这一点,谢谢。

【问题讨论】:

  • 更新您的问题添加适当的数据样本和预期结果
  • 好的,我正在更新

标签: php mysql sql laravel


【解决方案1】:

您可以使用两个belongsToMany() 关系并使用表格作为我的透视表:

public function doctors()
{
    return $this->belongsToMany(User::class, 'appointment', 'patient_user_id', 'doctor_user_id');
}

public function patients()
{
    return $this->belongsToMany(User::class, 'appointment', 'doctor_user_id', 'patient_user_id');
}

如果您经常使用appointment 表,您还可以将两个hasMany() 关系添加到Appointment 模型,并将两个belongsTo() 关系添加到User 模型。因此,在这种情况下,您可以同时使用belongsToMany()hasMany()belongsTo() 关系。

【讨论】:

  • 如何确保医生用户 ID 是医生类型??
  • 如果有一个医生表,我可以很容易地断定它的类型是医生,但是我如何通过枚举字段来确保它是类型列
  • @Sohel0415 当您将医生附加到具有attach()sync 的患者时,您就会这样做。当您获取数据时,只需使用doctorspatients 关系来获取您想要的用户类型。这只是一个简单的多对多关系,因此可以像使用任何其他多对多关系一样使用它。
  • @Sohel0415 你到底是什么意思?为此,您将拥有 FK 和数据透视表 (@​​987654335@)。
  • 我可以通过 FK 确保医生用户 ID 存在于用户表上,但无法确定其类型
【解决方案2】:

是的,您只需创建一个 user 表即可实现此目的。

appointment表的“doctor_user_id”和“patient_user_id”创建2个外键,引用User表。

【讨论】:

  • 但这并不能确保医生用户 ID 是医生类型
  • 在 SQL server 中,我们可以通过“检查约束”来管理,但 MySQL 没有。您可以通过触发mysqltutorial.org/mysql-check-constraint 来实现相同的目的...因此,在插入/更新数据之前,请确保“医生用户 ID”的插入记录仅是医生的类型。
  • 您可以在插入/更新之前从 PHP 代码中管理相同的内容
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多