首页 文章

删除Eloquent记录之间的关系

提问于
浏览
3

我创建了两个扩展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:调用未定义的方法Illuminate \ Database \ Query \ Builder :: detach()

以及

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

这给了我错误:

Tag.php第34行中的FatalErrorException:调用未定义的方法Illuminate \ Database \ Eloquent \ Collection :: detach()

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

1 回答

  • 5

    您可以将 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, ...]);
    

相关问题