删除Eloquent记录之间的关系

时间:2015-12-01 19:43:35

标签: laravel-5 eloquent many-to-many laravel-5.1 detach

我创建了两个扩展Eloquent(联系人和标签)的类,它们具有ManyToMany关系。我试图创建取消标记联系人的方法,但是无法找到任何文档来告诉如何删除关系表中的条目而不删除标记本身或联系人。

到目前为止,我已经尝试了

$contact = Contact::find($contact_id);
$tag = $contact->tags->where('id', '=', $id);
$tag->delete();

这只会删除联系人。它有意义,它不起作用,但我不知道还有什么可以尝试。我不想删除联系人或标签,只是两者之间的关系。

我现在也尝试过:

$tag = Tag::find($id);
$tag->contacts->detach($contact_id);

这给了我错误:

  

Builder.php第2071行中的BadMethodCallException:调用undefined   方法Illuminate \ Database \ Query \ Builder :: detach()

以及

$tag = Tag::find($id);
$contact = $tag->contacts->find($contact_id);
$tag->contacts->detach($contact);

这给了我错误:

  Tag.php第34行中的

FatalErrorException:调用未定义的方法   照亮\数据库\锋\收藏::分离()

Contacts和Tags类都扩展了Illuminate \ Database \ Eloquent \ Model;

1 个答案:

答案 0 :(得分:6)

您可以将detach用于多对多关系

http://laravel.com/docs/5.1/eloquent-relationships#inserting-many-to-many-relationships

您只需传递标签的ID即可。记下"标签"

后的括号
$contact->tags()->detach($id);

由于它是多对多的,你也可以反过来做

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

同样,您可以使用attach创建关系。只是猜测,因为你不知道分离,你可能也可以使用附加。 Attach可以使用单个ID或ID数组(加上一些更高级的选项)

$contact->tags()->attach($id);
$contact->tags()->attach([$id1, $id2, ...]);