在不知道其中一个外键的情况下删除数据透视表行

Posted

技术标签:

【中文标题】在不知道其中一个外键的情况下删除数据透视表行【英文标题】:Delete a pivot table row without knowing one of the foreign keys 【发布时间】:2016-06-04 09:44:47 【问题描述】:

我目前有一个加入组表和联系人表的数据透视表(待定邀请)。共有 4 列:

标识 | group_id |联系方式 |电子邮件

电子邮件字段只是所涉及联系人的电子邮件 ID。当我知道 group_id 和相应的电子邮件但不知道联系人 ID 时,我需要删除待处理的邀请。标准分离函数:

$groups->contacts()->detach($contact_id);

需要提供联系人 ID。有解决办法吗?

【问题讨论】:

我认为您应该将email 字段保留在Contact 模型中,并保留数据透视表的if。然后找到具有给定电子邮件地址的Contact 并将其与Group 分离,如下所示:$group->contats()->detach($contact->id); 即使 Contact 模型中有多行具有相同的电子邮件(因此给了我多个contact_ids),这是否有效?我问是因为我在 User 模型和 Contact 模型之间也有一对多的关系。如果您认为相关,我会将这些信息添加到问题中。 【参考方案1】:

您可以手动从数据透视表中删除选定的行:

\DB::table('contacts_groups')
  ->whereGroupId($groupId)
  ->whereEmail($email)
  ->delete();

【讨论】:

我正在寻找一个使用枢轴的基于雄辩的命令。但如果没有这样的可能,我会接受你的回答 Eloquent 关系类(如 BelongsToMany)只允许根据相关模型的 id 分离记录。不可能以简单的方式基于其他属性从数据透视表中分离。您当然可以使用给定的电子邮件获取所有相关记录,然后遍历它们并通过它们的 ID 分离它们,但这效率不高。

以上是关于在不知道其中一个外键的情况下删除数据透视表行的主要内容,如果未能解决你的问题,请参考以下文章

Excle数据透透视表如何删除数据透视表

在不知道对象键的情况下访问对象值

没有外键的NHibernate映射集合

在不知道值键的情况下读取孩子的值

如何在不允许表为空的情况下删除ng-repeat表行?

没有数据库外键的 ORM