Laravel 4 多对多更新

4
我被卡在一个问题中,找不到解决方案,这很烦人。
我有两个表,一个叫做“contacts”,另一个叫做“phonebooks”,它们与第三个表“contacts_phonebooks”相关联,这是一个多对多的关系,概述如下:
contacts:id(主键) phonebooks:id(主键) contacts_phonebooks:contactid(外键),phonebooksid(外键)
非常简单和清晰,它可以工作。
我正在使用Laravel 4和Eloquent ORM,当我需要获取、插入和删除时一切都正常,但是当我需要更新联系人时我失败了。我有一个表单,里面有一些复选框,代表所有的电话簿(每个复选框的名字为phonebook[]),所以当你勾选其中一个时,电话簿的ID将会保存在*contacts_phonebooks*中,与联系人的ID对应。
问题是这并不正确!我的意思是,当我运行以下代码时:
$contact = Contact::find($id);
$contact->contact_name = Input::get('newCName');
$contact->contact_surname = Input::get('newCSurname');
$contact->contact_email = Input::get('newCEmail');
$contact->contact_phone = Input::get('newCPhone');
$contact->contact_birth = Input::get('newCDate');
$contact->phonebooks()->sync(Input::get('phonebook'));
if($contact->save())
{
    return "TEST DONE?";
}

它会删除与联系人ID相关的*contacts_phonebooks*中的每一行,并仅保存新选择的一行...我知道这很奇怪,我会更好地解释一下。我想要更新Mr.x,他实际上在“Stackoverflow”电话簿中,我希望将他添加到“Nerd”电话簿中,所以我点击更新并选择了“Nerd”,另一个已经被选择。当我更新时,系统会删除“Stackoverflow”链接,并仅保存“Nerd”电话簿(使用上面的代码),这让我很疯狂,因为Laravel 4文档说您应该使用sync()方法来更新多对多关系。我不知道如何解决它,希望你能理解我的问题。干杯。
3个回答

3
文档中说:“同步方法接受一个ID数组,将其放置在中间表上。此操作完成后,模型中只有数组中的ID才会在中间表上:”
所以我认为你可能正在寻找的是“attach()”。
然后您需要使用“detach()”将其从其他地方删除。 $contact->phonebooks()->attach(Input::get('phonebook'));

看起来有点奇怪,但它能正常工作...流程是每次我都必须使用 $contact->phonebooks()->detach() 然后 $contact->phonebooks()->attach(Input::get('phonebook'))。 - ExoticSeagull
1
在这种情况下,您正在提供错误的同步参数。请检查我创建的此测试代码。http://paste.laravel.com/F3b - user1669496
那个数据透视表迁移中的外键应该是整数,但显然并不太重要,因为它仍然可以正常工作。 - user1669496

1
文档中提到:`sync`方法接受一个ID数组,用于放置在枢轴表上。

0
你的数据透视表应该被命名为contact_phonebook,这在Laravel的文档中有明确说明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接