我遇到了问题我无法找到解决方案,这让我感到烦恼。
我有两个表,一个名为 contacts ,另一个名为 phonebooks ,它们与第三个名为* contacts_phonebooks *的表相关联,这是一个很多 - 以下总结了许多关系:
我正在使用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() 方法,以更新多对多关系。
我不知道如何解决它,我希望你能理解我的问题是什么。
干杯。
答案 0 :(得分:3)
文档说“同步方法接受一个ID数组放在数据透视表上。完成此操作后,只有数组中的ID位于模型的中间表上:”
所以我认为你可能正在寻找的是attach()
。
$contact->phonebooks()->attach(Input::get('phonebook'));
然后你必须使用detach()
将他从另一个中删除。
答案 1 :(得分:1)
如docs中所述:sync
方法接受要放置在数据透视表上的ID数组。
答案 2 :(得分:0)
您的数据透视表应该命名
contact_phonebook
它在Laravel的文档中指定了。