繁体   English   中英

Laravel:多对多共享表

[英]Laravel: many-to-many with shared table

我有一个具有许多Employees Locations模型-类似地, Employees属于Locations

很好,效果很好,但是后来我看了添加PhoneNumbers 无论LocationEmployee可能有一个电话号码(办公室号码与个人号码)

从逻辑上讲:

Locations的hasMany PhoneNumbers (多个办公室线)和Employees的hasMany 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     |
                     ...

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

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

注意:在此示例中,我只可以在每个表上创建一个phone_number字段( locations.phone_numberemployees.phone_number等),但是出于两个原因,我希望避免这种情况:

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

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

在“位置”和“员工”模型上,添加以下关系:

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

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

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

在phone_numbers表上,添加两个新字段:phonable_type和phonable_id。 在迁移中,这些字段使用$table->morphs('phonable'); 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()关系,就可以使任何模型成为可phonable模型。

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

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

有关多态关系的文档可在此处(4.2)此处(5.0)找到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM