4

我陷入了一个问题,我找不到解决方案,这让我很烦。

我有两张表,一张称为联系人,另一张称为电话簿,它们与第三张名为 *contacts_phonebooks* 的表链接,这是一个多对多关系总结如下:

  • 联系人: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?";
}

它会删除 *contacts_phonebooks* 中与联系人 ID 关联的每一行,并仅保存选中的新行...我知道这很奇怪,我试图更好地解释它。我想更新 Mr.x 而他实际上在“Stackoverflow”电话簿中,我想将他添加到“Nerd”电话簿中,所以我点击更新并选择了“Nerd”,另一个已经被选中。

当我更新他时,系统会删除“Stackoverflow”链接并只保存“Nerd”电话簿(带有上面的代码)这让我发疯了,因为 Laravel 4 Doc 说你应该使用sync()方法来更新多对多的关系。

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

干杯。

4

3 回答 3

3

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

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

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

然后,您将不得不使用detach()将他从另一个中删除。

于 2013-07-29T21:31:30.230 回答
1

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

于 2013-07-29T21:38:26.293 回答
0

你的数据透视表应该被命名 contact_phonebook ,并在 Laravel 的文档中指定。

于 2013-11-07T19:44:37.893 回答