2013-07-29 1 views
4

Я застрял в проблеме, и я не могу найти решение этого, это меня раздражает.Laravel 4 Многие для многих обновляют

Я две таблицы, одна называется контактов, а другой называется и телефонные книги они связаны с третьей таблицей под названием * contacts_phonebooks *, это многие-ко-многим резюмировать следующим образом:

  • контакты: идентификатор (рк)
  • : идентификатор телефонных книг (рк)
  • contacts_phonebooks: ContactId (Ф.К.), phonebooksid (Ф.К.) Довольно просто и ясно, и она работает.

Я использую Laravel 4 и Eloquent ORM, все работает отлично, когда я должен его извлекать, вставлять и удалять, но когда мне нужно обновить контакт, я терплю неудачу. У меня есть форма, в которой есть несколько флажков, которые представляют все телефонные книги (каждый флажок имеет телефонную книгу [] как имя), поэтому, когда вы проверяете один из них, идентификатор телефонной книги будет сохранен в * 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 *, связанные с контактным идентификатором и сохранить только новую проверили ... Это странно, я знаю, я пытаюсь объяснить это лучше , Я хочу обновить Mr.x, и он действительно находится в телефонной книге «Stackoverflow», я хочу добавить его в телефонную книгу «Nerd», поэтому я нажимаю на обновление, и я выбрал «Nerd», другой уже выбран.

Когда я обновляю его систему удаляет «Stackoverflow» ссылку и сохранить только «Nerd» телефонная книга (с приведенным выше кодом) это вещи сводит меня с ума, потому что Laravel 4 Док говорит, что вы должны использовать синхронизации() чтобы обновить отношения «многие-ко-многим».

Я не понимаю, как это решить, надеюсь, вы поймете, в чем моя проблема.

Cheers.

ответ

3

В документации сказано «синхронизации метод принимает массив идентификаторов для размещения на сводной таблицы После того, как эта операция завершена, только идентификаторы в массиве будет находиться на промежуточной таблице для модели:.»

Так что я думаю, что вы, вероятно, ищете, это attach().

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

Тогда вам придется использовать detach(), чтобы удалить его от другого.

+0

Это кажется немного странным, но он работает ... поток процессов заключается в том, что я должен использовать каждый раз $ contact-> phonebooks() -> detach(), а затем $ contact-> phonebooks() -> attach (Input :: get ('phonebook')) –

+1

В этом случае вы задаете неверные параметры синхронизации. Проверьте наш тестовый код, который я создал.http://paste.laravel.com/F3b – user1669496

+0

Внешние ключи этой миграции сводных таблиц должны быть целыми числами, но на самом деле это не имеет большого значения, поскольку он все еще работает. – user1669496

1

Как указано в docs: Метод sync принимает массив идентификаторов для размещения на сводной таблице.

0

Ваша сводная таблица должна быть названа contact_phonebook и указывается в документации Laravel.

 Смежные вопросы

  • Нет связанных вопросов^_^