Laravel 4多对多更新

时间:2013-07-29 20:06:55

标签: php database many-to-many laravel-4 eloquent

我遇到了问题我无法找到解决方案,这让我感到烦恼。

我有两个表,一个名为 contacts ,另一个名为 phonebooks ,它们与第三个名为* contacts_phonebooks *的表相关联,这是一个很多 - 以下总结了许多关系:

  • contacts:id(pk)
  • 电话簿:id(pk)
  • contacts_phonebooks:contactid(fk),phonebooksid(fk) 非常简单明了,而且很有效。

我正在使用Laravel 4和Eloquent ORM,当我要获取它,插入并删除它时,每个事情都可以正常工作但是当我需要更新联系人时我很失败。我有一个表单,其中包含代表所有电话簿的复选框(每个复选框都有电话簿[]作为名称),因此当您选中其中一个时,电话簿ID将保存在带有联系人ID的* contacts_phonebooks *中。 问题是这不是真的!我的意思是当我运行此代码时:

$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 Doc说你应该使用 sync() 方法,以更新多对多关系。

我不知道如何解决它,我希望你能理解我的问题是什么。

干杯。

3 个答案:

答案 0 :(得分:3)

文档说“同步方法接受一个I​​D数组放在数据透视表上。完成此操作后,只有数组中的ID位于模型的中间表上:”

所以我认为你可能正在寻找的是attach()

$contact->phonebooks()->attach(Input::get('phonebook'));

然后你必须使用detach()将他从另一个中删除。

答案 1 :(得分:1)

docs中所述:sync方法接受要放置在数据透视表上的ID数组。

答案 2 :(得分:0)

您的数据透视表应该命名     contact_phonebook 它在Laravel的文档中指定了。