我很好奇为什么hasMany人的口才和belongsToMany人的口才不同.特别是自定义联接表名——对于一个给定的Comment属于多个Role的系统,给定的Role将有多个Comment,我想将关系存储在一个名为my_custom_join_table的表中,并将键设置为comment_keyrole_key.

return $this->belongsToMany('App\Role', 'my_custom_join_table', 'comment_key', 'role_key'); // works

但反过来说,我无法定义自定义表(至少文档没有提到它):

return $this->hasMany('App\Comment', 'comment_key', 'role_key');

如果我有一个Role对象,它是hasMany Comments,但我使用一个非标准表名来存储该关系,为什么我可以使用这个非标准表的一种方式而不是另一种方式?

推荐答案

hasMany表示One To Many关系,belongsToMany表示Many To Many关系.它们都是不同的关系类型,每个都需要不同的数据库 struct ——因此它们采用不同的参数.

关键区别在于,在一对多关系中,您只需要对应于相关模型的两个数据库表.这是因为对关系的引用是stored on the owned model's table itself.例如,您可能有一个Country模型和一个City模型.一个国家有许多城市.然而,每个城市只存在于一个国家.因此,您可以将该国家/地区存储为on the City model itself(country_id或类似的数字).

然而,多对多关系需要一个third数据库表,称为pivot table.pivot表存储对这两个模型的引用,您可以将其声明为关系声明中的第二个参数.例如,假设你有City个模型,还有Car个模型.你想要一种关系来展示人们在每个城市驾驶的汽车类型.在一个城市里,人们会驾驶many种不同类型的汽车.然而,如果你看一种车型,你也会知道它可以在many个不同的城市行驶.因此,这两种型号都不可能存储city_idcar_id,因为每种型号都有多个.因此,将这些引用放在透视表中.

根据经验,如果使用belongsToMany关系,它可以与另一个belongsToMany关系配对,这意味着您有第三个透视表.如果使用hasMany关系,它可以与belongsTo关系配对,并且不需要额外的数据库表.

在您的示例中,您只需要将逆关系设置为belongsToMany,然后再次添加自定义表,以及外键和本地键(颠倒其他模型的顺序).

Php相关问答推荐

根据类别在WooCommerce中添加库存数量后缀

有条件的运费率基于购物车小计与WooPayments货币转换

通过激活模板在数据库中创建表

显示WooCommerce当前产品类别或标签的短代码

使用箭头函数语法时,在回调范围内无法访问变量变量(警告:未定义的变量)

在WooCommerce中添加特定产品类型的百分比费用和固定费用

使用CODIGNITER3中的OR和AND子句进行查询

CKEDITOR-如何在PHP中判断提交后的空数据

向WooCommerce管理订单总额添加自定义总额行

将数据推入所有子数组条目

允许在WooCommerce管理订单列表中使用计费邮箱进行搜索

在WooCommerce中以编程方式添加特定产品后,将价格设置为零

跟踪通过 WooCommerce 分层定价表插件进行的购买

Composer自动加载器重复了子类的类文件路径

PHP文件如何从CSS执行

用于检测此模式的正则表达式:something;something=something,something=something... 未知次数

在 WordPress 中使用 $wpdb 运行 MySQL 事务是否安全?

每个发布请求 Laravel 9 的 CSRF 令牌不匹配

从 CSV 文件 seeder 数据库时的额外行

如何将子查询结果添加到学说 2 中主查询的末尾?