Laravel:许多到许多与共享表(Laravel: many-to-many with share

2019-10-22 04:42发布

我有Locations模型,它的hasMany Employees -类似的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. 绑定到更复杂的模型(更换PhoneNumberImage ,现在你有更多的数据处理)

Answer 1:

你要找的Laravel的多态的关系。 而不是创建每个相关的表一个新的领域,你有两个领域:相关的ID和相关类型。

在这两个您的位置和员工模型,添加以下关系:

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

在您******中国模式,添加以下关系:

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

对多态关系的文件可以发现这里(4.2),或在这里(5.0) 。



文章来源: Laravel: many-to-many with shared table