×

eloquent关联关系——多对多

2021-01-19 19:30:42 Falcon

相对于前面所讲的一对一和一对多(反向多对一)关系,多对多涉及到一个新的方法:belongsToMany,其含义为【属于多个】。多对多关系的表述中,将不再使用hasMany来表达。 

举个例子:一个用户可以有多个角色,一个角色也可以有多个用户。此时我们在两个model中都使用belongsToMany来建立关联关系,即:一个用户被多个角色所拥有,一个角色也被多个用户所拥有。

需要注意的点有:

  • benlongsToMany方法有7个参数,除了第一个,
    • 参数1,属于的类名,仍然建议使用::class语法,不要使用字符串;
    • 参数2:指定二者建立关联的中间表名,eloquent默认使用model1_model1的规则联想表明两个model按照字母顺序排序
    • 参数3:当前model在关联关系中的外键名;
    • 参数4:关联的另一个model的外键名。
  • benlongsToMany的参数可以直接全部使用默认值,当然需要按照规范创建表名和字段名。

多对多关系中的支点

多对多关系中的中间表就是一个支点,通过此支点建立两个表之间的多对多关系。

查询多对多关系中的一个model实例时,会发现其带有一个pivot字段。默认pivot包含两个字段,即:两个外键字段。如果实际中间表除了两个外键之外还包含其他字段,并且你想在model的查询结果实例中包含此字段,则需要在belongsToMany之后使用withPivot方法表明你想要包含的支点的字段,比如:

当然有些时候你不想使用pivot这样抽象的字段名来访问支点数据,比如使用subscription这样具体的词来描述一个多对多的订阅关系,那么可以使用as方法来给支字段改名:

 

定义关系的时候可以使用wherePivot和wherePivotIn来过滤关系,比如:

 

定义中间表的模型

讲到这里我们仍然没有给中间表(支点表)建立model,中间表需要继承pivot类,比如:

 

然后可以使用using方法来建立关联关系,比如: