gpt4 book ai didi

php - Laravel:多对多共享表

转载 作者:行者123 更新时间:2023-11-29 06:29:17 24 4
gpt4 key购买 nike

我有一个 Locations 模型,它有许多 Employees -- 同样 Employees 属于 Locations

这很好,而且效果很好,但后来我考虑添加 PhoneNumbers LocationEmployee 可能有电话号码(办公室号码与个人号码)

逻辑上:

Locations hasMany PhoneNumbers(多个办公室线路)和Employees 有许多 PhoneNumbers(家庭/手机?)

然而,当您在 Laravel 中创建这样的 hasMany 关系时,它会向 PhoneNumbers 表添加一个字段。所以我们现在有两个字段:location_idemployee_id

如果我让 location_idemployee_id 可以为空,我就可以让它工作,就像这样:

+----+--------------+-------------+-------------+
| id | number | location_id | employee_id |
+----+--------------+-------------+-------------+
| 1 | 800-555-0123 | 1 | null |
| 2 | 800-555-0124 | 1 | null |
| 3 | 800-555-0125 | 1 | null |
| 4 | 859-555-0199 | null | 1 |
...

但是,如果我添加可以拥有电话号码的新实体(客户?求职者?供应商?),这并不能很好地扩展

如何使用同一个辅助表创建多个单独的多对多关系?

注意:在此示例中,我可以在每个单独的表(locations.phone_numberemployees. phone_number 等)但是我希望避免这种情况有两个原因:

  1. 数据完整性(如果所有电话号码都在一个公用表中,则很容易验证没有输入重复的电话号码)
  2. 绑定(bind)到更复杂的模型(将 PhoneNumber 替换为 Image,现在您有更多的数据要处理)

最佳答案

你正在寻找 Laravel 的多态关系。您没有为每个相关表创建一个新字段,而是有两个字段:相关 ID 和相关类型。

在您的 Location 和 Employee 模型上,添加以下关系:

public function phones()
{
return $this->morphMany('PhoneNumber', 'phonable');
}

在您的 PhoneNumber 模型上,添加以下关系:

public function phonable()
{
return $this->morphTo();
}

在您的 phone_numbers 表中,添加两个新字段:phonable_type 和 phonable_id。在迁移中,这些字段使用 morphs() 方法添加:$table->morphs('phonable');

一切设置完成后,您的数据将如下所示:

+----+--------------+-------------+---------------+
| id | number | phonable_id | phonable_type |
+----+--------------+-------------+---------------+
| 1 | 800-555-0123 | 1 | Location |
| 2 | 800-555-0124 | 1 | Location |
| 3 | 800-555-0125 | 1 | Location |
| 4 | 859-555-0199 | 1 | Employee |
...

通过此设置,您可以制作任何您想要的模型phonable,只需添加一个morphOne()morphMany() 关系到它.

此外,关系属性将生成与类型相关的正确模型。给定以上数据:

var_dump(PhoneNumber::find(1)->phonable); // will dump Location object
var_dump(PhoneNumber::find(4)->phonable); // will dump Employee object

可以找到关于多态关系的文档here (4.2)here (5.0) .

关于php - Laravel:多对多共享表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28923610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com